CC BY 4.0 (除特别声明或转载文章外)
如果这篇博客帮助到你,可以请我喝一杯咖啡~
节日快乐(并不)…
「机器学习」顾名思义就是机器通过对观测到的事物进行归纳,进而总结出它们之间的规律、关系一类。
各神经元从输入层开始,接收前一级输入,并输入到下一级,直至输出层。整个网络中无反馈,可用一个 DAG(有向无环图)表示。
在这么多神经元更新的时候,让它们每个值都往一个方向变,什么方向呢?就是刚刚我们说的使得损失函数向不断降低的方向变,降低模型预测结果和给定的目标值之间的差距, 这点记住了就足够了。更为复杂的神经网络构建方式,从本质来讲都一样,是通过不断调整各个神经元中的待定系数使得损失函数向不断降低的方向移动。
通过凸优化的方式能够顺利求出损失函数的极值。然而我们在真正的生产环境遇到的各种神经网络中包含着非常多的线性和非线性分类器函数组合,这也就意味着,在这种复杂的网络环境中,损失函数极有可能,甚至可以说几乎 一定不是凸函数一一在这个函数的空间中会呈现出「层峦叠幢」、 「坑坑洼洼」的不规则形 状,而非前面我们画出来的一个大碗。 因此,在真正的商用框架中——比如 Tensor Flow 会用很多技巧来寻找在整个向量空间中拥有极小值点的参数向量。对于这种不规则形状的非凸函数来说,当然也是可以通过遗传算法、随机梯度下降等多种方式相结合的方法来不断试探找到极小值点位置的。当然,这些过程对于一个普通的 TensorFlow 的使用者来说是透明的,它们已经由那些数据科学家们实现并封装在框架中了。
下面整理一些学习笔记。
网络结构
BP(前馈神经)网络是所有的神经网络中结构最为单纯的一种,如下图。分成输入层、隐藏层、输出层。节点数目可以不一样而且不对称。神经网络本身就有很多种设计模式,并且会在不同的模式下 产生不同的训练效果和运用特点。
损失函数
管这种函数叫Cost或者Loss。深度学习中的损失函数其实是不一而足的,每种损失函数在当初诞生的时候都是有-些客观环境和理由的。但不管是哪种损失函数,都有这样几个特点。
- 恒非负。都说是损失了,最圆满的情况就是没损失,或者说损失为 0,但凡有一点拟合的偏差那 就会让损失增加。 所以损失函数都是恒非负的,否则也无法出现合理的解释了。
- 误差越小函数值越小。这个性质也是非常重要的,如果函数定义的不好,优化起来没有方向或者逻辑过于复 杂,那对于问题处理显然是不利的。
- 收敛快。指在我们优化这个损失函数Loss的迭代过程中需要让它比较快地逼近极小值,逼近函数值的低点。同等情况下一个钟头能得到解那绝对没必要花三个钟头,好的损失函数的定义会让这个训练时间在一定程度上缩短的。这个条件不能算是必要条件,因为它只要不影响正确性,慢一点其实也不能算作「错误」。
训练过程
回过头来再看我们初始化$(w_0,b_0,Loss_0)$后下一步怎么做。 $w_1=w_0-\eta\frac{\partial Loss}{\partial w},b_1=b_0-\eta\frac{\partial Loss}{\partial b}$ 再次强调一下,不求梯度(偏导数)的情况下,通过改变$w$或$b$的值是一定能够比较 出来移动的方向的,但是问题是不知道移动多少比较适宜。 而有了偏导数与学习率$\eta$的乘积后,当这个点逐步接近「碗底」的时候,偏导数也随之降低,移动的步伐也会慢慢减小,收敛更为平缓,不会轻易出现「步子太大」而越过最低点的情况。一轮一轮进行迭代,直到每次更新的值非常小,损失值不再明显减少就可以判断为训 练结束。此时得到的$w,b$值就是我们要求的模型。