DNN/CNN/RNN/LSTM
1、熟知:卷积神经网络、循环神经网络、长短期记忆网络的原理及结构特点,卷积、池化的本质,解码器-编码器设计思路及缺陷,注意力模型的原理和特点。卷积算法,池化算法,通道、参数共享、稀疏连接、特征图、全连接等基本操作实现翻番、softmax、svm等输出层特性,反卷积算法,RNN常见分类,RNN主要缺陷,输入门、遗忘门、输出门控制过程,LSTM存在问题及GRU特点。熟悉LeNet,AlexNet,GoogleNet基本架构和原理。
2 应用: 能基于卷积神经网络的原理将其应用于非图片处理领域中,将LSTM用于股票、天气、销售情况等具有时序特点的领域中。
https://www.kaggle.com/sanjayar/step-by-step-guide-for-sales-data-prediction-lstm
https://www.kaggle.com/c/favorita-grocery-sales-forecasting/discussion/47582
https://www.shiyanlou.com/courses/1363/learning/
卷积神经网络CNN
认识卷积
受哺乳动物视觉系统的结构启发,比如我们看图片或是物体,肯定是先从某些大致的特征去认识,然后才会去看细节,而不会每个点都看完才知道是啥。所以图片是肯定有些局部特征可以提取的。研究者就引入了强大模型结构来处理图片,后来发展成了现代卷积网络的基础。当然大多数哺乳动物都是色盲,人类无疑有更强的辨识能力。
卷积是什么呢?
卷积的概念来自数学的数据处理,比如我们对某些信号数据分析时候,更关注观察点附近的时间数据,比如频谱信号、炒股、金融都会看到这些。其实就是种函数运算,把数据降维分析,比如傅里叶变换。本质上卷积是将二元函数 U(x,y) = f(x)g(y) 卷成一元函数 S(t):
对于离散形式的函数是
第一个参数x就是我们要处理的输入,第二参数w叫核函数,a表示时间t的时间间隔,比如以T为时间间隔,整个函数过程就是叫做一个卷积,而函数的输出可以被叫做特征映射(feature map)。换句话说完成特征映射的过程叫卷积,不过是某一个东西和另一个东西在时间维度上的“叠加”作用。而使用卷积运算的重要作用就是,通过卷积运算,可以使原信号特征增强,并且降低噪音。
举个简单不恰当的例子,我不炒股,但大家应该都看股市基金这类的走势,某一两天的价格不是关键的,我们关注的是买入点卖出点前后的一段时间的趋势,因为时间离当下越近的数据与结果越相关,作用越大,而我们重要在于判断一段时间是上升还是下降的,是就如我们股市分析里的移动平均线操作,移动平均可抚平短期波动,反映出长期趋势或周期,那么简单认识上“移动平均就是一种卷积”,当然移动平均也可以是加权平均,或是别的方法,总之就是反应这部分数据的特征。
卷积神经网络里的卷积层:
如何识别图像中“有什么”以及“是什么”?卷积神经网络最多就是用在图像的特征提取上了,从图像上就更直观的认识卷积了。计算机图像是用像素点表示的,比如黑白图片就是像素大小加上每个像素的灰度值,彩色图片就是加上红蓝绿(RGB), 也就是说比如某张图的大小是–100*100,那么它将会有100x100x3万个值,这里1和3被称为通道,常见的彩色图像就是三通道图像。
灰度图为例,0代表白,10代表黑,那么可以用二维矩阵表示,卷积的过程就是用核函数(这里就是核矩阵),在输入矩阵中进行滑动,扫到的局部矩阵作为当前输入和这个核矩阵进行矩阵乘法得到一个代替的值(对应位置相乘再相加),这些值按顺序摆成一个矩阵,从图像上看经过卷积核的处理后,将会出现最右的明亮分割线。而这样的卷积核实际上可以理解为左边的1和右边-1有着明显的差距,而我们需要找出这个差距,所以利用这样的卷积核可以很容易的发现一些特征,这就是对特征进行了提取。
生物理解
看到神经网络学习很多时候都是一堆概念,除了线性代数、张量、最优化等数学或计算机的,当然很多不知道的一开始都是像在看生物学、神经科学之类的。所以这个本来就是来自神经网络的启发的交叉学科,是个计算机、工程、数学、生物学、模式识别等大杂烩一样的交叉学科。学习的时候可以区分开来一个个角度看,再联系起来类比。生物学家做了个有趣的实验发现,大脑神经系统只会对部分边缘的兴奋产生反应,也就是常听的神经元放电,比如一些神经元只对垂直边缘产生兴奋,一些神经元只对水平或对角边缘产生兴奋。这些神经元都以柱状结构的形式进行排列,而且一起工作才能产生视觉感知。
卷积神经网络 就是从视觉上获得启发,这就像我们看人的时候,可能也不是一扫过就能都记录所有信息,有的先注意服装、有的先看大致身材,也有的看眼睛和鼻子等主要外貌,也可能看下发型等。逐步通过身形、着装、眼睛、脸等分析出女生是少女、中年还是老人、职业性格等属性。
其实这个在动物界就更为明显了,比如蛇通过热感观察,所以它看到的可能只是一片类似黑白图像,对于一些毛发细节其实不在意,但可以大致看到是什么物体。我们在认识一只狗的时候也是如此,不一定看到多少细节就可以马上区分。就像PS里的滤镜一样,主要特征放大效果。这也就是卷积的作用,在这里也叫过滤器。
那么从数学结构来看这个卷积神经网络的特点其实和前馈神经网络类似,除了最后的全连接层,中间多些卷积层、Relu激活层、池化层等等。
卷积层
前面说过卷积层就是特征的提取,也就是一系列的神经元,也就是一系列卷积滤波器,像照妖镜一样把各种妖怪照出来,扫到的地方特征就会进行卷积计算存放到下一层神经元里。网络里的神经滤波器越多,那么得到的特征就越多。具体就是一个n*n的矩阵,亦称卷积参数,卷积核或卷积滤波器。
激活层
就像一个抑制作用的层,只通过部分的特征,比如我们触摸超过一定温度的物体时候就会产生疼痛感。从模型来看就是类似逻辑回归的sigmoid函数,大于某些概率的为1,这个函数就很好模拟了神经突出的这一特点,这里激活层的激活函数可以是sigmoid、Relu或是双曲切线tanh等。ReLU(x)函数只返回max(0、x),或者说,只是去掉负权重。
另一个角度,真实的复杂世界往往是非线性的,一般的线性组合是无法很好的模拟的,使用激活层是在系统中引入非线性,这样可以提高模型泛化能力 ,避免过拟合。
激活层
池化层
池化层又叫汇合层,就是把数据做个汇聚操作,类似我们常见聚合函数,通常使用的汇合操作为平 均值汇合(average-pooling)和最大值汇合(max-pooling),需要指出的是, 同卷积层操作不同,汇合层不包含需要学习的参数。使用时仅需指定汇合类 型(average或 max 等)、汇合操作的核大小和汇合操作的步长等超参数即可。
从视觉角度看,池化层就是人对看到的进行降维抽象,我们只要记住一些动物就好,然后进行拓展认识。比如图片一块区域都是红色为主,那我们就记住大概是红色就好,其他就变为白色。具体就是一块矩阵的最大值或平均值。
那么从本质来说,池化层就是个下采样的过程,也看成 是一个用 p范数作为非线性映射的“卷积”操作,特别的,当 p 趋 近正无穷时就是最常见最大值。
池化层有三个特性:
1、特征不变性:汇合操作不改变,或是很小的改变特征的位置信息,使得模型关注的是某些特征信息而不是具体位置。
2、特征降维。
3、在一定程度上防止过拟合。
全连接层
全连接层在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、汇合层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的特征表示映射到样本的标记空间的作用。
目标函数
刚才提到全连接层是将网络特征映射到样本的标记空间做出预测,目标函数的作用则用来衡量该预测值与真实样本标记之间的误差。在当下的卷积神经网络中,交叉熵损失函数和 ℓ2 损失函数分别是分类问题和回归问题中最为常用的目标函数。同时,越来越多针对不同问题特性的目标函数被提出供选择。
循环神经网络RNN
为何要RNN
有了CNN为何还要RNN,那可以从应用和语言学习上来直观感受。比如传统卷积神经网络我们可以学习识别猫和狗,或是一段声音,但是这些基本是用所有样本训练了一次再进行,也就是我们学会了猫和狗,基本我们就可以识别了。而我们学习语言就不是这么简单,我们还要通过反馈来学,比如从儿童咿呀学语开始,先学了些单词,再组成短语词汇再到句子,我们听别人的话也是要根据之前学到的词汇语言来识别其意思。所以语言是通用的但是,每个人又都会学习训练成自己的语言特色。
语言本质就是通过给符号特定的意义,也就是猫是猫,如果我们小时候学的时候定义“猫”代表的是狗,那其实本质上没有什么区别,而这种意义通过顺序的组合又形成新的语义。这时候就要在通用神经网络上加入了人的先验知识,将文本信息按照序列输入的方式处理,就形成了RNN,循环神经网络。那么形式上讲,RNN的基础思想就是对于特定序列:在序列任务中前面的数据会对当前的计算产生影响。
所以RNN用最多的就是自然语言处理上,还比如各种人机交互系统,聊天机器人、问答系统、任务型人机对话,在这里可以理解为这段语言的上下文,根据以往的语言意义和具体上下文来判断语句的意义。当然RNN的应用领域还很多 还有视频处理, 文本生成, 语言模型, 图像处理,机器翻译, 机器写小说、语音识别,图像描述生成,文本相似度计算, 音乐推荐、网易考拉商品推荐、Youtube视频推荐等等。
RNN的工作原理
用最常见的NLP问题看下什么叫循环,为何要循环神经网络,比如我们判断一句话“我要吃苹果”,这时候我们分开为 “我”、“要吃” 、“苹果”;这就是说我们会看动词前后判断苹果是什么,如果是“我要用苹果手机”这时候的苹果前面的动词,就是另一个输入,会影响这个苹果的意思,同时手机前面的“苹果”也可以帮助定义“苹果手机”是一个名词。
所以在自然语言处理的时候一个个词语会根据上下文来判断一个词的意思,那么我们就需要根据前面学习的输出,在作为后面学习的输入,这就是一种循环的结构了。解决这类问题,就是一类处理序列的信息的问题。具体来看是什么样的循环:
RNN的一个简单结构,它由输入层、一个隐藏层和一个输出层组成: