感知机(perceptrons)

定义: 接收数量不定的二进制输入,得到一个二进制输出。

perceptrons

$$ output= \begin{cases} 0 & \text{if $\sum_j{w_jx_j} \leq$ threshold} \\ 1 & \text{if $\sum_j{w_jx_j} \gt$ threshold} \end{cases} $$

可以理解为对不同的证据进行权重加和,然后做出决定。

$$ output= \begin{cases} 0 & \mbox{if } w\cdot{x}+b\leq{0} \\ 1 & \mbox{if } w\cdot{x}>+b>0 \end{cases} $$

另外一种用法,感知机可以用来模拟基础的逻辑函数,比如 ANDORNANDNAND可以作为通过运算,得到所有的逻辑运算,It is not a big deal。 重要的是通过学习的方法,我们可以自动得到 $w$。

Sigmoid

怎么才能学习训练呢? 对权重的做微小的改变,所得的输出也只是发生微小的改变。 数学意义上: 目标函数对权重是平滑的。 感知机是不满足的,直观上一个单元的0,1翻转, 可能导致其后的网络输出发生巨大变化,另外就是数学上 step function 是不可导的, 所以需要引入 sigmoid 神经元。

$$ \sigma(z)=\frac{1}{1+e^{-z}} $$

对比 sigmoid function 与 step function 的图形,前者可以看作后者的平滑近似。

sigmoid&step

为什么 sigmoid 函数可以满足对应的微小变化呢? 因为已经说了 sigmoid 可微, 目标函数的微分,只使用一阶微分近似来近似,可以看到是一个目标函数微分与权重微分的线性关系。

$$ \Delta{output}\approx\sum_j{\frac{\partial{output}}{w_j}\Delta{w_j}+\frac{\partial{output}}{b}\Delta{b}} $$

设计神经网络

input layer -> hidden layer -> outputlayer

目标函数

针对手写数字识别问题: 设置目标函数为

$$ C(w,b)=\frac{1}{2n}\sum_x{||y(x)-a||^2} $$

为什么目标函数使用用 Mean Squre Error (MSE)? 对于训练来说是可导的。

优化

如何优化这个问题呢?有的时候,求解的问题有闭形解,但有的时候没有,或者太难得到。 可以使用梯度下降(gradient descent)来求解。 为什么对于凸函数,梯度下降一定能得到最优解? (Refer to Convex)

下面说下,如何迭代使 $C$ 不断减小。为了简化分析,假设 $C$ 只信赖 $u$,$v$ 两个变量,

$$ \Delta{C}\approx\frac{\partial{C}}{v_1}\Delta{v_1}+\frac{\partial{C}}{v_2}\Delta{v_2} $$

我们知道梯度的定义:

$$ \nabla{C}=\left(\frac{\partial{C}}{v_1},\frac{\partial{C}}{v_2}\right) $$

代入上式,$C$ 的微分可以简化为

$$ \Delta{C}\approx\nabla{C}\cdot{\Delta{v}} $$

怎么才能让$\Delta{C}$为负呢?$\Delta{v}$取负梯度即可!(其实还有其它方向,Refer to Convex) 不断计算梯度,取一个小的增量,一步步迭代,得到函数的最优值。

$$ v\prime\to{v-\eta\nabla{C}} $$

其中$\eta$是学习率 learning rate,在迭代过程中可能要调节,不然大了目标函数不下降,小了学习的慢。

Stochastic Gradient Descent

原始目标函数是计算所有样本的损失,然后求平均,但数据量大的时候,一次迭代就要花费很长时间。 随机梯度下降则不是使用全部样本,只使用一小簇样本来近似计算梯度,works well!

http://neuralnetworksanddeeplearning.com/chap1.html