机器学习
-
机器学习算法在诸如网页搜索,信息过滤,商品推荐 等场景中得到了极大应用,即使是一些难表征的图像识别,语音识别的场景中也有可利用的空间,其正在被运用到生活越来越多的场景中
-
传统机器学习算法对原始数据的处理程度有限,且构造复杂,需要更为专业的技术人员对提取器的特征进行设计,使其能将原始数据转换为能表征的向量以进行运算,或是被用于分类聚类。
-
表征学习是机器学习方法中的一种,核心在于让机器自动挖掘原始数据的特征,使得特征得以被用以检测或分类
深度学习
-
深度学习是表征学习的方法之一,通过多层的非线性模型,对原始数据进行转换,最后在新的特征空间得到特征。深度学习可以用一个更为通用的程序,对不同的数据自动地进行特征提取。
-
深度学习在更复杂,更高维的数据中拥有相对于其它机器学习算法更优异的表现,被广泛应用于各个领域。
-
预测潜在药物分子的活性
-
分析粒子加速器数据
-
重建大脑回路
-
预测非编码DNA突变对基因表达和疾病的影响
-
话题分类
-
语义分析
-
机器问答
-
语言翻译
-
......
-
有监督学习
-
有监督学习是机器学习最常用的形式
-
为了比较实际输出与期望输出之间的损失多大,我们需要定义一个损失函数
-
用于训练的每个模型都有一个权重 (weight),权重用于调整模型预测值和实际值的损失,合适的权重可以使得损失变小
-
为了更好调整权重向量,我们需要引入梯度向量,用于评定每次权重的增减,对整体损失的影响。权重的调整方向应与梯度向量的方向相反
-
实际操作中,大多数人都会选择随机梯度下降算法(SGD:stochastic gradient descent)
SGD
-
对原数据集选出示例集,计算输出和平均梯度,并根据计算的结果不断调整权重,直到训练集的目标函数平均值停止减少
-
对于每次迭代,SGD都会对每一个示例集进行平均噪声梯度估计
-
相比于更复杂的优化技术,SGD的梯度下降速度更快
分类器
-
现行的机器学习算法大多数都使用线性分类器 ,且由人工设置特征
-
对于一个两类的线性分类器,计算特征向量各分类的加权和后,判断其是否超过预先设置的阈值,以此归类到不同的类别中
-
20世纪60年代以来,人们开始意识到线性分类器只能将它们的输入空间分割成非常简单的区域,即由超平面分隔的半空间
-
但是诸如图像和语音识别就需要相应的输入/输出函数对输入信号的变化不敏感,以应对复杂的情况(图像旋转,音量大小),也要对特定的微小变化敏感(两只白狗物种的区别,线性分类器或其它浅层分类器无法胜任以上的工作
-
因此浅层分类器需要一个好的特征提取程序以应对选择性不变的困境------对图像中有区分度的部分作出选择,而对诸如图像识别中动物姿势不同的部分进行忽略
-
即使使用了核函数来提取特征,也无法从训练的示例中得到很好的拓展
-
这些方法都是人工设置特征,使得设计者需要专业的知识和更好的特征设置
-
在深度学习中,体系结构是由简单模块组成的多层堆栈,其中所有(或大部分)都需要学习,其中许多模块计算非线性的输入-输出映射。堆栈中的每个模块都转换其输入,以增加表示的选择性和不变性。有了多个非线性层,比如深度为5到20,一个系统可以实现极其复杂的输入功能,这些功能同时对微小的细节很敏感(区分萨摩耶德和白狼),并且对背景、姿势、灯光和周围物体等无关的大型变化不敏感。
反向传播算法
-
从模式识别的早期开始,研究人员的目标就是用可训练的多层网络取代手工设计的特征,但尽管它很简单,但直到20世纪80年代中期才被广泛理解。
-
事实证明,多层体系结构可以通过简单的随机梯度下降来训练。只要模块的输入和内部权值是相对光滑的函数,就可以使用反向传播程序来计算梯度。
-
反向传播算法的核心在于链式求导法则
链式求导法则
- 简单的链式求导法则如下所示
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> ∂ E ∂ x = ∂ E ∂ z ∗ ∂ z ∂ y ∗ ∂ y ∂ x \frac{\partial E}{\partial x} = \frac{\partial E}{\partial z}*\frac{\partial z}{\partial y}*\frac{\partial y}{\partial x} </math>∂x∂E=∂z∂E∗∂y∂z∗∂x∂y
x
的变化可以通过链式求导法则不断传播,最终在E上得到体现
反向传播
-
对于一个如图所示的神经网络,我们先对每一层的单元求得加权和,以作为下一层的输入,最终得到输出层的结果。
-
这里每一层的
y/f()
都是一个非线性函数 ,通常被称为激活函数,用于学习数据中的复杂关系,以传播到下一层
- 为了应用反向传播,我们还需要对每一个隐藏层(Hidden Unit)的单元计算误差函数偏导数的加权和 ,通过最后的输出逐步反向更新每个单元的权值,此时得到新的神经网络,再通过相同的形式向下传播,得到新的输出,以此不断迭代,直到最后输出层的误差无法再减少。
激活函数
- 每个神经网络其实都可以看成是大量的神经元 和它们之间的有向连接 构成,激活函数表现的是神经元输入输出间的映射关系。
性质
-
连续可导的非线性函数(部分点不可导不影响整体)
-
函数及其导函数简单(计算效率高)
-
导函数值域合适(太大和太小都会导致效率慢或结果不稳定)
-
单调递增(收敛快)
常见的激活函数
阶跃函数
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> s g n ( x ) = { 1 x ≥ 0 0 x < 0 sgn(x)=\begin{cases} 1 &x\ge0\\ 0 &x<0 \end{cases} </math>sgn(x)={10x≥0x<0
- 不连续,不光滑,反向传播不可导
sigmod函数
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> s i g m o d ( x ) = 1 1 + e − x sigmod(x) = \frac{1}{1+e^{-x}} </math>sigmod(x)=1+e−x1
优点 | 缺点 |
---|---|
函数的输出在(0,1)之间,输出范围有限,优化稳定,可以用作输出层 | 在变量取绝对值非常大的正值或负值时会出现饱和现象,意味着函数会变得很平,并且对输入的微小改变会变得不敏感。在反向传播时,当梯度接近于0,权重基本不会更新,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练 |
连续函数,便于求导 | sigmoid函数的输出不是0均值的,会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响 |
计算复杂度高(指数形式的函数) |
Tanh函数
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> t a n h ( x ) = e x − e − x e x + e − x t a n h ( x ) = 2 s i g m o d ( 2 x ) − 1 tanh(x) = \frac{e^x-e^{-x}}{e^x+e^{-x}}\\ tanh(x)=2sigmod(2x)-1 </math>tanh(x)=ex+e−xex−e−xtanh(x)=2sigmod(2x)−1
-
tanh(x)
可由sigmod(x)
伸缩平移得到,故其有些特点与sigmod(x)
相同 -
特点
-
连续光滑,严格单调
-
输出范围为(-1,1),以(0,0)为对称中心,均值为0
-
输入在0附近时,输出变化明显;离0越远,输出变化越,最近趋于1
优点 缺点 输出关于原点对称,0均值,可以规避zigzag现象 存在梯度消失问题 zigzag:当函数的输入值非常大或非常小时,输出值会非常接近0或1,此时函数的斜率会非常小,导致函数曲线出现明显的波动
-
ReLU函数
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> R e L U ( x ) = max ( 0 , x ) = { 0 , x ≤ 0 x , x > 0 ReLU(x) = \max{(0,x)} = \begin{cases} 0,& x\le0\\ x,& x>0 \end{cases} </math>ReLU(x)=max(0,x)={0,x,x≤0x>0
优点 | 缺点 |
---|---|
输入>0时保持梯度为恒定值不衰减,从而缓解梯度消失问题 | 输入>0时梯度为1,可能导致爆炸问题 |
输入<0时导数为0,当神经元激活值为负值时,梯度不再更新,增加了网络的稀疏性,从而使模型更具鲁棒性 | 输入<0时导数为0,一旦神经元激活值为负,则神经元进入永久性dead状态,梯度不再更新,导致梯度消失问题,学习率过大容易导致所有神经元都进入dead状态,所以需设置较小的学习率 |
计算速度快,ReLU函数的导数是if-else的实现逻辑,计算非常方便快速,在多层网络中,该网络通常学习得更快,允许在没有无监督预训练的情况下对深度监督网络进行训练 | ReLU的输出均值大于0,容易改变输出的分布,可以通Batch Normalization缓解这个问题 |
Batch Normalization(批量归一化):在传统的深度网络中,过高的学习率可能会导致梯度爆炸或消失,以及陷入不良的局部最小值。 批量归一化有助于解决这些问题。 通过对整个网络的激活进行标准化,它可以防止参数的微小变化放大为梯度激活中较大的和次优的变化
卷积神经网络
-
卷积神经网络被设计用来处理多维数组形式的数据
-
在卷积神经网络背后有四个关键思想
-
局部连接(local connections)
-
共享权重(shared weights)
-
池化(poolings)
-
多层结构(many layers)
-
-
结构:
-
前几个阶段由卷积层和池化层组成。卷积层中的单元被组织成特征图,在其中,每个单元通过卷积核的权值连接到前一层的特征图中的局部图。这个权值和的结果其后通过一个非线性的函数(例如ReLU),特征图所有的单元共享同一个卷积核,特征图的不同层使用不同的卷积核
-
后几个阶段我们将非线性模型和池化层堆叠,形成更多的卷积层和全连接层,再使用反向传播梯度,训练每个卷积核中的权值,以此完成训练
-
-
这些可用多维数组表示的阵列数据,在局部通常是高度相关 的,且局部的数据相对于其它图案或标志是相对位置不变 的,这就意味着我们可以在不同的单元中共享相同的权值 ,且在阵列数据的不同位置检测相同的图案
-
卷积层负责检测前一层特征的局部连接 ,池化层负责将相似的特征合并为一个特征。典型的池化单元通常取一个单元大小内的数据最大值作为新的数据,通过不断偏移,使得原数据降维并保持相对不变性
分布式表示和自然语言处理
-
使用深度神经网络进行自然语言处理具有巨大的优势。如果我们用一个N向量来表示词的上下文,每个分量为0/1表示不存在/存在,就可以对下一个词的出现进行预测
-
由于整个特征提取过程是程序自动的,程序往往能在大量的语料库中对于相似的词,得到的词向量也距离相近。实践中发现对于报纸中的周二和周三等词,得到的词向量相似度非常高
-
在引入神经语言模型之前,语言统计建模的标准方法没有利用分布式表示,而是基于计算
N-gram
的出现频率。N-gram
的数量级能达到VN
,其中V
是词汇量的大小,需要一个相当庞大的语料库才能完成 -
N-gram
将每个单词作为一个原子单元 来处理,它们不能在语义相关的单词序列中进行泛化。神经语言模型可以,因为它们将每个单词与实值特征向量相关联 ,语义相关 的单词在该向量空间中彼此接近。
递归神经网络(Recurrent neural networks)
-
反向传播最大的用处便是用来训练递归神经网络
-
RNN在用于处理序列化数据 (如图像和语言)时拥有极佳的表现。RNN每次只处理一个输入序列的一个元素,在隐藏层的单元中维护一个状态向量(State Vector),状态向量可以包含该序列过去所有元素的历史信息,当我们需要考虑隐藏层单元不同内的输出时,我们可以将其展开,得到新的神经网络,以此更好使用BP
-
然而在实际训练中RNN可能会出现问题,BP的梯度在每一次传播中都会增长或者缩小,在经多次传播后,可能会出现梯度消失 或爆炸的情况
-
随着技术进步,RNN在预测文本时得到了人们的青睐。它可以用于预测相同语言的下一个词,也可以用于机器翻译,将输出层作为另一个网络的额外输入,最后可以根据一种语言的词概率分布,生成另一种语言的词序列
-
如果将RNN在时间上展开,可以看成一个层数极深的前馈神经网络,所有层共享相同的权重,但难以长期存储信息
-
为了解决这一问题,人们提出了显式内存扩充网络 ,基于此出现了LSTM网络
LSTM
-
LSTM-Long Short-Term Memory ,长短期记忆网络,与RNN相比更适用于处理和预测时间序列中间隔较长的重要事件
LSTM RNN 记忆细胞和门控机制就是为了解决权重矩阵的乘积导致的问题而设计 在处理长时间依赖性问题时会出现梯度消失/爆炸问题 门控机制可以更好地控制信息的流动,有效地避免了无关信息的干扰和梯度消失问题 缺乏这样的机制,信息的流动不够灵活 更适用于处理长时间依赖性问题,因为其能够有效地保存和更新历史信息 更适用于处理短时间依赖性问题
记忆细胞(Memory Cell)
-
LSTM
的核心,负责保存重要的信息,将信息传递给其后的网络层 -
维护一个持久化的状态,随着后期的输入而不断更新,保存历史信息用于当前预测
输入门(Input Gate)
- 决定当前输入信息是否写入记忆细胞,控制输入信息对输入细胞的影响
遗忘门(Forget Gate)
- 决定记忆细胞中的信息是否被遗忘,控制已经保存的信息是否消失
输出门(Output Gate)
- 决定记忆细胞中的信息是否输出,控制记忆细胞中保存的信息会不会对后续网络层造成影响
内存模块(Memory Module)
-
除了使用显式内存扩充网络,也有人提出可以使用内存模块来扩充RNN,包括使用神经图灵机(Neural Turing Machine)和记忆网络,
-
神经图灵机的网络由RNN可选择的读或写的"磁带状"存储器扩充
-
记忆网络可以由一个可联想的存储器扩充
-
除了简单的记忆,神经图灵机器和记忆网络被用于通常需要推理和符号操作的任务。神经图灵机甚至可以教"算法"。当他们的输入由一个未排序的序列组成时,他们可以学习输出一个已排序的符号列表,其中每个符号都有一个实际值,该值指示其在列表中的优先级。记忆网络可以训练成在一个类似文本冒险游戏的环境中跟踪世界的状态,并且在阅读故事之后,他们可以回答需要复杂推理的问题。
学习收获
-
阅读原文的英文文献相当吃力,由人工智能三大马车撰写的review更是难上加难。在逐行阅读的过程中,常常需要对相关的知识进行扩充阅读。不夸张地说,表面上文献中只提到了人工智能学习中的一部分内容,实际上哪怕是三个单词,这三个单词背后所需要的额外阅读内容也远远大于这篇文献的词数。经过许多遍的阅读后我还是完成了这篇阅读笔记,其中相当大一部分内容都与原文的翻译相当相似(有些词想替换但最后发现还是翻译更为严谨些,最好应该是使用原英文表述更佳,但受制于有限的英语水平只能作罢)
-
在对每一个部分阅读过程中,看到关键词总能回想起自己曾经学过的记忆是相当美妙的,也接触到了人工智能领域更为专业化的表达。由于本人水平实在有限,只能从文中提到的知识不断复习之前曾学过的内容,期待以后对人工智能学习更为深入后,再从review中迸发出新的灵感