抽象的神经网络
神经网络是一个包含了一套固定的运算规则以及大量可以调整的参数的可拟合函数, 可以直接把它记作. 拟合的过程就是调整使得原始输入数据经过网络之后得到的预测值 尽量的逼近预期输出, 为了评估拟合的质量, 需要定义一个优化问题, 用一个范数描述之间的距离:, 最小化这个范数的过程称之为训练,对着训练好的网络输入新的原始数据得到预测结果的过程称为推断(一般我们会将这个范数称为损失, 损失是一个广义的范数, 它并不需要严格遵守范数的定义, 事实上对于tensorflow来说, 任何形如的函数都可以成为损失函数)。
一个神经网络的运算规则往往会分解成若干个层,tensorflow往往将神经网络的运算规则称之为运算图,层是运算图中一个可以模块化表示的运算单元,当然层本身也是一个运算图。将一个层的运算描述成, 那么简单的n层前馈神经网络就表示成:
这里要注意到两个层也可以被打包成一个层, 因为层的本质是带参函数, 带参函数之间的复合, 还是带参函数因此也是层. 层的概念是为了更好的解构一个复杂的网络, 实际情况下的神经网络的搭建也是以层为基础进行的.
总结一下, 至此我们将一个神经网络问题抽象成了一个这样的模型: 网络由一个含参数的函数描述, 我们要解决的问题是用这个函数来描述一个复杂的非线性系统(这个系统可能是输入一个照片输出照片里面是猫猫还是狗狗), 我们不了解这个系统的内部原理, 因此没有能力对它进行直接的数学建模, 它现在是个黑盒子, 用一个未知的函数表示, 所幸的是我们可以不断的给这个黑盒子输入不同的值, 得到相应的黑盒输出. 准备一个集合, 让它经过黑盒子得到了预期输出的集合, 这个过程叫做准备训练集. 我们将称作训练集, 前面说过我们的目标是解决下面的优化问题:
当足够小的时候, 我们可以认为网络现在可以很好的拟合未知系统了, 那么这个网络就可以代替未知系统进行推断了.
具象的神经网络
最最简单的神经网络模型叫做线性回归, 它在高中时候就已经教过了, 线性回归的问题是用这个函数来拟合线性系统, 线性拟合的点是这样的数对集, 如果我们将评估的目标范数定为二范数, 那么求解使得二范数最小的k,b的过程就叫最小二乘拟合. 显然对于这么简单的优化问题来说, 解是可以解析的表达的. 称为训练集, 计算k,b的值的过程称为训练, 用训练过的k,b推测未知的x对应的y的过程叫做推断.
对于这个简单的模型来说, 整个流程会出现一些问题. 假如里面其实是一个圆形上的很多个点, 就会发现无论我们怎么调整k,b都无法让损失很小, 这种现象叫做欠拟合, 原因是我们的网络过于的简单了, 没有能力描述(拟合)目标系统. 还有一种情况是, 里面只有一个点, 我们无法确定k,b的值, 或者我们现在用一个很复杂的网络来拟合一个很简单的系统, 我们会发现损失降低到了几乎为0, 比如我们用一个10次函数来拟合一个二次曲线, 提供的训练集有10个点, 这个函数可以被调整的让损失等于0(二项式拟合), 但是这并不是我们想要的. 当一个网络的描述能力很强, 而目标系统却十分简单或者训练集丰富程度不够无法很好的描述目标系统, 那么就会发生过拟合, 过拟合导致的是网络的低泛化能力, 没有泛化能力的网络就失去了推断能力.
神经网络的一些概念
正则化
正则化是一个很宽泛的概念, 广义上来说所有的抑制过拟合的手段都可以称为正则化, 因此对角加载的本质也是正则化, 自适应滤波的初始化也是正则化. 在线性代数里面正则化是施加在欠定方程组上的, 当方程组的数量少于方程组中未知数的数量时候, 方程预期会有无数个解, 如果对这些解再施加一个约束, 比如说希望解的2范数尽量的小, 此时可能就只有一个解了, 神经网络的正则化与这个类似.
神经网络的正则化可以描述为