6.1 XOR例子
对于如图所示的异或问题,简单的单层线性函数无法解决异或问题;
解决办法是增加深度,即加入隐层单元h;,完整版的模型是。
应该是哪种函数?线性模型到目前为止都表现不错,让也是线性的似乎很有诱惑力。可惜的是,如果是线性的。那么前馈网络作为一个整体对于输入仍然是线性的。暂时忽略截距项,假设并且,那么。我们可以将这个函数重新表示成,其中。
为了解决这个问题,可以使用非线性激活函数relu,。
。
现在可以给出一个XOR问题的一个解。令这个解可以成功解决XOR问题。
6.2 神经网络结构
6.3 神经网络表达力与过拟合
- 理论上说单隐层神经网络可以逼近任何连续函数(只要隐层的神经元个数足够多);
- 虽然从数学上看表达能力一致,但是多隐层的神经网络比单隐藏层的神经网络工程效果要好得多;
- 对于一些分类数据(比如CTR预估里),3层神经网络效果优于2层神经网络,但是如果把层数再不断增加(4,5,6层),对最后结果的帮助就没有那么大的跳变了;
- 图像数据比较特殊,是一种深层(多层次)的结构化数据,深层次的卷积神经网络,能够更充分和准确地把这些层级信息表达出来;
- 提升隐层层数或者隐层神经元个数,神经网络“容量”会变大,空间表达能力会变强;
- 过多的隐层和神经元节点,会带来过拟合问题,不要试图通过降低神经网络参数数量来减缓过拟合,用正则化或者dropout;
6.4 传递函数(激活函数)
为什么通常Relu比sigmoid和tanh强,有什么不同?
- 主要是因为它们梯度特性不同,sigmoid和tanh的梯度在饱和区域非常平缓,接近于0,很容易造成梯度消失的问题,减缓收敛速度。梯度消失在层数多的时候尤其明显,是加深网络结构的主要障碍之一。
- Relu的梯度大多数情况下是常数,有助于解决深层网络的收敛问题。Relu的另一个优势是在生物上的合理性,它是单边的,相比于sigmoid和tanh,更符合生物神经元的特征。
- 提出的sigmoid和tanh,主要是因为它们全程可导。还有表达区间问题,sigmoid和tanh区间是0到1,或者-1到1,在表达上,尤其是输出层的表达上有优势。
- Relu更容易学习优化,因为其分段线性性质,导致其前传,后传,求导部分都是分段线性。而传统的sigmoid函数,由于两端饱和,在传播过程中容易丢弃信息。
6.5 损失函数(代价函数)
两类问题
- 回归问题(均方误差MSE)
将损失函数对进行求导可以得到: - 分类问题(交叉熵)
分类问题相较于回归问题会多一层网络,这就是softmax层,softmax变换公式为:通过softmax变换使得输出变为一个概率分布,概率之和为1。同样,数据本来的标签之和也为1。怎样衡量这两个概率分布之间的距离呢?我们通过KL距离(相对熵)来衡量两个向量之间的关系。
KL距离(相对熵)
KL距离,是Kullback-Leibler差异的简称,也叫相对熵。它衡量的是相同事件空间里的两个概率分布的差异情况。其物理意义是:在相同事件空间里,概率分布对应的每个事件,若用概率分布编码时,平均每个基本事件(符号)编码长度增加了多少比特。我们用表示KL距离,计算公式如下:若两个概率分布完全相同时,即,其相对熵为0。
对于分类问题,一个样本对应的网络的输出是一个概率分布,而这个样本的标注一般为,也可以看做一个概率分布(硬分布)。
cross entropy可以看做是与之间的KL距离。假设,其中1为的第个元素(索引从0开始),令,则公式中的表示当时,的值为1。写成向量形式
6.6 梯度下降(批量梯度下降、随机梯度下降、小批量梯度下降)
批量梯度下降
优点:
- 一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行;
- 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优;
缺点:
- 当样本数目m很大时,每迭代一步都需要对所有样本计算,训练过程会很慢;
- 从迭代的次数上来看,BGD迭代的次数相对很少,其迭代的收敛曲线示意图可以表示如下:
随机梯度下降
优点:
- 由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快;
缺点
- 准确度下降,由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛;
- 可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势;
- 不易于并行实现;
小批量梯度下降
优点:
- 通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多;
- 每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果;
- 可实现并行化;
缺点:
- batch_size的不当选择可能会带来一些问题;
batch_size的选择带来的影响:
- 在合理范围内,增大batch_size的好处:
- 内存利用率提高了,大矩阵乘法的并行化效率提高;
- 跑完一次epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快;
- 在一定范围内,一般来说batch_size越大,其确定的下降方向越准,引起训练震荡越小;
- 盲目增大batch_size的坏处:
- 内存利用率提高了,但是内存容量可能撑不住了;
- 跑完一次epochs(全数据集)所需的迭代次数减少,想要达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢;
- batch_size增大到一定程度,其确定的下降方向已经基本不再变化;
6.7 前向传播
6.8 反向传播
来源:CSDN
作者:AI就是爱
链接:https://blog.csdn.net/qq_37388085/article/details/103705688