1.时间序列分析:利用历史股票价格的时间序列进行分析,使用ARIMA等时间序列分析算法预测未来的股票价格。
2.神经网络:使用ANN、CNN、RNN等算法结构,构建模型,基于历史的数据和技术指标(如RSI、MACD等)进行学习,最终输出预测结果。
3.集成学习:将多个模型的预测结果进行加权平均,形成最终的预测结果。例如使用随机森林、AdaBoost等算法结合SVM、LR、KNN等基础模型进行集成。
4.基于类似贝叶斯理论的方法:将基于历史数据和技术指标的预测结果进行修正。
5.自然语言处理:对于新闻、公告等文本信息进行分词、关键词提取、情感分析等处理,以此预测股票价格走势。
需要注意的是,预测股票价格是一项具有风险的任务,机器学习算法预测的结果仅具有参考性,不能保证完全正确。投资者在做出投资决策时,应综合参考多方信息。
RNN是深度学习在自然语言处理领域中的元老级神经网络,它奠定了神经网络技术在NLP领域的发展方向,其名声仅此于CNN,虽然近年来它已经鲜少露面,但江湖地位不减,就连当红明星GRU和LSTM都是它的变种。
RNN(Recurrent Neural Networks),循环神经网络,指的是模型循环处理每个input,每次循环迭代称为time(在公式中简称“t”)。Figure 1中,等号右侧部分就是RNN的展开图:input, ( ~ )经过隐藏层循环处理,每个time会生成一个output, ( ~ ),此外还会生成一个hidden state,,它是隐藏层对input的学习成果,hidden state会和下一个input一起作为参数传入隐藏层(红色箭头)。
我在 深入浅出全连接层 中提过,RNN是由全连接层(Linear layer)组成的,准确地说,RNN中的input layer、hidden layer、output layer,就是Figure 1中的那些箭头,它们都是全连接层。
本文将会以重写RNN的方式来由浅入深剖析RNN,点击【 这里 】可以查看完整源码。
除了使用 Fastai Library 外,还会用它的轻量级NLP数据集: http://files.fast.ai/data/examples/human_numbers.tgz 。数据集是从0到9999的英文数字:“one, two, three, four, five, ......, nine thousand nine hundred ninety eight, nine thousand nine hundred ninety nine”。
我们的任务就是创建一个RNN N-gram语言模型来学习数数,比如说,看到“one, two, three, four, five, ”这10个连续token(","也是一个token),就能预测出第11个token是"six"。关于token、N-gram、语言模型、embedding以及nlp mini-batch等内容,可以回看以前的文章 自己动手开发AI影评写作机器人 ,这里不再赘述。
如Figure 1所示,Model1通过一个for循环来(递归)处理每个input(token),并将hidden state传递到下一个循环,等到N个(x.shape[1])token都学习完之后,用第N个hidden state来生成一个output。这就是RNN根据前面N个token来预测第N+1个token的过程。
之所以RNN可以预测第N+1个token,是因为hidden state包含了前面N个token的信息。 h = h + F.relu(self.input(self.emb(x[:, i]))) ,为RNN预测提供了前文的信息。
Learner是Fastai提供用于模型训练的library,“acc_f”这栏显示的是模型的预测准确率:45.9%。
Model1的hidden state只保留了同一个mini-batch内的token信息,一旦开始学习新的mini-batch,hidden state就会清零: h = torch.zeros(x.shape[0], nh).to(device=x.device) 。
因此,Model3会保留前一个mini-batch训练得到的hidden state,换句话说,此时的hidden state保留了整个dataset的信息。不仅如此,Model3不只是预测第N+1个token,它会预测所有token的下一个token。
Model3实现了RNN的基本功能,它的预测准确率达到72.2%。除此之外,用tanh替代relu,准确率会提升到75.4%,标准RNN的默认激活函数就是tanh。
Model4是Model3的对标模型,用Pytorch官方提供的RNN实现,从训练结果来看,它准确率比Model3要低不少,因此,这里温馨提醒,不要把官方code当作圣旨。实践表明,relu+batchnorm的组合应用到RNN中卓有成效,可惜,它无法作用于nn.RNN。
虽然nn.RNN的表现不如自己手撸的好,但并不是鼓励大家自己造轮子,而且本人也很反对像自己造轮子这种几乎不输出价值的工作方式。事实上,当我们使用2层RNN之后,Model4的表现就优于Model3了。
2层RNN的结构如下图所示,2个隐藏层虽然比1个隐藏层效果更好,但计算量也翻倍了,由于全连接层的参数数量比卷积层的要多得多,深层RNN的训练时间要远远长于相同深度的CNN,因此,RNN层数不宜过多。
RNN虽然通过hidden state来保留各token的信息,但它并不能有效地处理和使用这些信息,它会将所有训练得来的信息都一股脑地塞进hidden state,并用它来影响后续每个token的学习,而且这种影响不管是好是坏都会随着训练的深入,像滚雪球一样有增无减地将越多越多的信息裹胁进来。
显然RNN缺乏对新老信息(hidden state和token)的调控,这样一来,当要学习的token较多时,起始部分的token信息在hidden state中的占比就会越来越小,换句话说,文本起始部分的内容很容易会被忘记。
GPU和LSTM就是专门为了应对长文本训练而设计的,它们为RNN中增加了input gate、output gate、forget gate、update gate等机制,对进出信息进行筛选,丢弃过时的、无用的信息,调控输入信息对模型训练的影响力等。
Model5用GRU替代了RNN后,在相同情况下,模型准确率又有了提升,达到了83.8%。关于GRU的分析留待下一篇博文,这里不作展开。
本文通过重构RNN的方式详解了RNN模型的构成,通过分析它的缺陷,进一步介绍了GRU和LSTM的工作原理。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)