在上一篇中我们读到了首个多层的神经网络结构——前馈神经网络。其中主要关注如何将本身非线性二元的问题转化为可以数学建模,例如典型的如何解决“异或XOR”问题,以及介绍了一种基本的将类型分值(score)转化为分类输出(classification)的案例。 这次会读到更接近“机器学习”这个概念上的一些数学模型,借助这些模型人们能首次尝试用AI解决一些有现实价值的、具备一定复杂度的问题。
本文还是以翻译PPT页内容为主,打星号的部分则是我的补充说明。由于bias似乎在机器学习领域中被普遍翻译成“偏置”,因此后续的部分都会采用这一翻译。
1 目标函数:学习什么——Objective function: what to learn
*对于回归问题,一般需要一个数学工具来衡量误差程度。
例如,使均方误差尽量小(也被称为L2损失或平方损失)。
可能的结果值的范围是:最小为0(所有预测都正确)、最大为正无穷(没有正确结果且偏差很大)。
*图中的均方误差MSE公式,之前读图像质量评估的那一篇也介绍过。对于图像来说,后续还引入了更多比MSE更科学的目标函数。
*对于分类问题,一般需要将某些值输入转换为概率分布或更复杂的对应模型,最终得出可能的类型。
例如:使用交叉熵损失函数来尽量缩小类型预测与真值的概率分布差距。
*它与上一篇中介绍的softmax的关系是,交叉熵损失会结合softmax,用来计算预测分布与真实分布之间的差异 。
*真值在计算中被表达为:真类型为1,其它类型为0——被称为Hot vector。
*关于熵和信息量描述公式等概念,文末会附一篇知乎介绍。
*LCE就是交叉熵损失函数,输入和比较的是预测类型的概率分布和真值的概率分布。
*K是类型数,对于真值y来说,如果其分布是正确类型为1,其它为0。
*对于单个样本k,当其为真类型时,转化为对其预测概率的log计算(如图)。
最小值0——例如正确的预测,则是-log(1);最大值无穷——例如(完全)错误的预测,则是-log(0)。
*计算器之类的显示中对数log是以10为底,而exp是以特殊实数e为底的对数。
*从中可以观察出,使用对数函数后,更明显的错误会得到更大的误差值(红色),而更接近正确则得到趋近于0的值(蓝色)。
*这里也是回顾了如何对预测结果进行误差评估的问题——通过目标函数。
在机器学习领域存在非常多的目标函数类型,这里(课件)中仅介绍最常用的一个。
2 梯度下降:如何学习——Gradient descent: how to learn
它是能以可扩展的方式训练非线性模型学习”大数据“的一种方案。
例如:学习线性模型以将英里转化为公里,此时只用观察输入的“英里”和输出的“公里”值的对应关系——最终能提炼成和常量相乘的形式。
第二个例子,计算美元和以色列谢克尔币的币值对应关系。(*这个例子没想到这么的“美式”)
理念:迭代地调整常量系数(例如,模型参数)以尝试降低误差。
迭代地查找值以解决优化问题(例如,一个目标函数的最小或最大值)。
类比(图中蓝字):从山的高处徒步到山的底部——以一种盲视的方式。
当计算最小化目标函数时,它也往往被以可替代的方式称为:代价函数、损失函数或误差函数。
梯度下降:以迭代的方式进行步长推进,在梯度相反的方向前进,并尝试找出最小值。
*这里摘录了一段百科中关于二元梯度的例子,能帮助理解梯度这一概念。三维空间中的梯度原理是相同的,只是维度更多。
当学习比率太小时,收敛至一个好的解就会太慢。
当学习比率太大时,则不可能找到一个好的解。
在所有训练样本上计算(批量梯度下降)——能减少弹跳次数,但在数据集很大时可能很慢或不可执行。
在一个训练样本上计算(随机梯度下降)——计算速度更快,能训练更大的数据集(每次迭代在内存中存储一个实例),但更新过程可预期地会弹跳很多次。
在一个训练样本子集上计算(小批次梯度下降)——相比SGD(随机梯度下降)能降低弹跳时的不稳定性,并且也能训练大数据集(每次迭代在内存中存储一批实例),但当数据集过大时仍会很慢或不可执行。
通常小批次梯度下降会用于匹配和内存相符的最大样本数量。
*这段主要在分析对于离散大规模样本如何训练,以进行梯度下降的问题。由于实际执行不可能是在所有样本上进行训练,故此产生了这部分考虑;最终目标都是梯度尽快下降到目标值,以确认样本的最小值。
3 训练一个神经网络:优化——Training a neural network: optimization
前向通道:散布训练数据通过模型,以进行预测。
量化模型预测结果相比训练数据的不足之处——使用目标(损失)函数来计算误差。
反向通道:使用预测输出,计算梯度并反向(相对向前而言) 分配修正值以应用于每个模型参数。
使用计算的梯度更新每个参数。
*这里面dissatisfaction直译是“不满”,blame直译是“指责”,都是更人格化的词语——可能是为了表达神经网络模型自行动态修正参数的过程。
权重变化极其小。
已经执行完了预设的尝试次数。
被错误分类的样本比例低于某个阈值。
反向传播理念——(偏导函数)链式法则:x = f(w), y = f(x), z = f(y)
*对于图中的z/w梯度,最终展开成如图的导数乘积的形式。
损失函数使用——平方误差函数(回归或二元分类问题)。
t是训练数据,此时是一个常数值,其它项在下一页介绍。
将E对wjk的梯度展开为如图的形式(绿框乘紫框)。其中右侧绿框和紫框中为各自的偏导函数展开化简结果。
*其中的累加项原理和上一篇的前馈神经网络相同。到这一步还是比较抽象的,后面会以实际例子解析。后续具体计算似乎忽略了最开头的负号,我的理解是计算误差可以不考虑负值。
核心观察:(计算梯度是)可能的,因为激活函数和损失函数是可微分的。(*可微分意味着连续变化)
*参照图中,对最后一个节点k进行梯度计算前后,需要基于Ok和Wjk的前值来计算误差函数e,并反馈影响权重项Wjk。
*对于其它隐藏层的参数计算,也可以通过函数对称性来解决。
*这里x1-x3是三个输入项,4-6是节点计算下标而不是值。而三个圆框中的1则是常数项(用来表示bias)。
分别输入1、0、1三个值,训练结果为t1=1。(*后面逐项解析,其中会用到S型函数作为激发函数)
回顾一下神经网络训练的几个步骤,第一步还是以前馈式的方式来计算。
*i4的加权计算如图(括号中是三个输入项加权,括号外是计算常数项),最终得出o4。
*最终计算出i6和o6。此时o6输入值为0.474,而训练数据t1=1。
*此时进入第二步,通过预测的结果以反向传播的方式影响模型参数。
*对应偏导数,其中sigmoid( ∑ Wjk*Oj) 对应的就是前面计算出的O6。代入计算得到e6。
*e5 = (e6 * W5,6) * O5 * (1 - O5) 。代入计算得到e5。
*设学习速率η为0.9,则W4,6的更新和η、o4、e6相关。基于这些已知的值可以更新W4,6权重值。
*偏置值的更新只和当前节点的误差有关。b6更新如图。
*同理即可完成整个神经网络权重的更新,后续就不补充重复的说明了,看图即可。
*最终一次训练并更新参数之后的结果如图。(*这里W5,6已经不用标红了,应该是课件错漏了)
这里使用平均梯度用于批量梯度和最小批次梯度的计算。
使用标准化的数据,均值为0而标准差为1(如图)。
简化学习的过程。
通过高斯或标准化分布随机抽选权重值。
将偏置都设置为0。
4 激发函数的梯度下降——Gradient descent for activation functions
*简单描述就是,阈值函数的方式因为没有梯度,变化率是0——因此是不可微分的,也无法进行梯度下降过程(及相关的训练)。
过小的梯度会限制模型参数梯度下降的量级(学习速度)。
基于ELU的连续大梯度的激发函数能有效支持学习过程。(*ELU是人为设计的一个经典分段函数,是Exponential Linear Unit的缩写)
虽然其中涉及到具体数学计算的部分个人理解起来也很吃力,需要回顾很多知识,但这套方式凝结的思想我觉得可以用简单通俗的语言概括如下:
到目前为止,读到的AI训练还是一个“做题家”的模式,即以一套神经网络模型来输入、预判、比对结果、回调权重,最终实现误差符合要求的训练好的模型。
这其中反向传播的过程之所以成立,是基于“激发函数是可微分”的这一点来设计的。在这个前提下,就可以通过梯度下降方法来不断调整参数,尽量逼近变化率最小值(接近真值)。
关于梯度下降的训练效率,课件中只稍微提到了一下,但实际上激发函数的选择(以及后续神经网络的更多特殊节点设计)是后人不断提升训练效率和预测准确度的重要方面。后续的课件也会继续深入这部分内容。
评论区
共 条评论热门最新