1 神经网络
个人对神经网络的一个理解:
以下图的这个结构为例:
首先第一层是我们传入的一个参数,这里我把传入的参数比作一个很复杂,很精简,很难懂数学公式。把机器比作一个人,对他提出的要求是理解这个公式,并且以后能够尽可能准确的去应用这个公式。
把第二层视作为他尝试理解这个公式的第一天,他能够理解一些,并且他试着转化为自己能够更加直观理解的方式去看这个公式(就像我现在在做的),然后第二层表示理解这层定义的第二天,依此类推,如果我们给他的层数(天数)越多,他最后可能会理解的更加准确,更好的应用,但是这会耗费很长时间,所以我根据定义的难度(特征数)和他的能力给他合理的层数(天数)让他理解,随着一层一层的推进,他就越来越能够以自己的方式进行解释,最后以正确的进行应用。
1.1 非线性假设:
面对有很多特征变量的时候,使用Logistic回归要得到一个复杂的决策边界就会出现非常多的二次项,很有可能出现过拟合并且运算量巨大。
1.2 神经元工作原理
我们大脑中的神经,Dendrite可以看作是一个Input,Axon可以看作是一个Output。那么Input和output之间的这一个部分就可以被看作为是处理信息和运算的这么一个部分。
当一个神经元想要将信息传输到另一个神经元的时候,就会一个神经元的Axon(output)传出来,传到另一个神经元的Dendrite(Input),然后同理可以再继续传递。
下图模拟了一个简单的神经元,我们将x1,x2,x3(有时可以将x0(bias unit)输入,有时不输入)输入到黄色的神经细胞进行处理,最后再进行输出。这里的函数名叫做Sigmoid (logistic)activation function。这里的θ也可以叫做weight(权重)。
而所谓的神经网络是有一组神经元所构成的。如下图我们可以看到这个神经网络一共有三层。第一层:输入层(x);第二层:隐藏层(在计算时看不见);第三次:输出层
a^(j)_i:j表示所在层,i表示项号。
θ^(j):是由第j+1层的项数作为行,第j层的项数+1作为列的权重矩阵。
神经网络与Logistic回归在最后一部分的做法很相同,都是通过最后输出的hypothesis函数的值来进行预测。不同的是他使用的特征值输入不再是x1,x2,x3,而是通过自己训练得到的a1,a2,a3。更具weight_1的不同我们可以得到不同的复查模型。
下图中,x1 XOR(或) x2表示x1或者x2; x1 XNOR x2表示Not(x1 XOR x2),即与其相反的结果。
其中XOR表示相同取0,相异取1
下图举了一个小例子 AND:
假设:
x1,x2:只能取0(假)或1(真)
y = x1ANDx2,且参数已知。
根据图下个我们可以看到,当z为4.6时,函数值为0.99非常接近于1。当z为-4.6时,函数值为0.01非常接近于0。这个就非常像我们的Logistic回归了。
然后我们分别输入不同的x1和x2的值,可以看到如右边的列表所示的结果,然后就可以用于判断结果。
可知当x1为真ANDx2为真时才有h(x)为真。
所以使用AND
OR function:
下面只要x1和x2当中有一个为真即可使得h(x)为真,所以叫OR函数
下图的例子中,只有当x1=0的时候才能使h(x)为真,即这个是NOT函数
用NXOR(表示x1与x2取值相同,即都为0或都为1)
若要构造一个XNOR我们可以进行拆分
下图先构造了 (NOT(x1))AND(NOT(x2))
再将其与x1ANDx2用OR组合,即可得到XNOT。
2 神经网络多分类问题:
2.1 神经网络损失函数:
- L:层数
- s(j):表示第j层激活项的数量
下图中左下为2分类问题;右下为多分类问题。
下图中上面的部分是Logistic回归正则化的代价函数
下面部分为神经网络的代价函数:
在逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量y,但是在神经网络中,我们可以有很多输出变量,我们的
h
θ
(
x
)
h_θ (x)
hθ(x)是一个维度为K的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些,为:
h
θ
(
x
)
∈
R
K
,
(
h
θ
(
x
)
)
i
=
i
t
h
o
u
t
p
u
t
h_θ (x)∈R^K , (h_θ (x))_i=i^{th} output
hθ(x)∈RK,(hθ(x))i=ithoutput
这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出K个预测(K代表我们的类别数,比如我们要机器来预测图片是一个人还是车还是摩托,那么我们的K=3,每次输入一组特征,就会做出三次预测,然后选择三次预测中可能性最大的那个来与实际的进行比较),基本上我们可以利用循环,对每一行特征都预测K个不同结果,然后在利用循环在K个预测中选择可能性最高的一个,将其与y中的实际数据进行比较。
正则化的那一项只是排除了每一层 θ 0 θ_0 θ0后,每一层的 θ θ θ矩阵的和。最里层的循环j循环所有的行(由 s l s_l sl +1 层的激活单元数决定),循环i则循环所有的列,由该层( s l s_l sl层)的激活单元数所决定。即: h θ ( x ) h_θ (x) hθ(x)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行regularization的bias项处理所有参数的平方和。
2.2 反向传播算法:
δ(l)_j表示第l层的预测值与第l层的实际值之间的差。
我们从最后一层的误差开始计算,误差是激活单元的预测(a^(4) )与实际值(y^k)之间的误差,(k=1:k)。
我们用δ来表示误差,则:δ^((4))=a ^((4))-y
前向传播的固定步骤:
首先输入训练集,
θ
∗
x
(
i
)
=
z
(
2
)
θ * x^{(i)} = z^{(2)}
θ∗x(i)=z(2)
然后利用
g
(
z
(
2
)
)
g(z^{(2)})
g(z(2))计算
a
(
2
)
a^{(2)}
a(2),依此类推最后计算出
a
(
4
)
a^{(4)}
a(4)
反向传播:
首先观察只有一个样本集的反向传播算法。
假设λ=0,然后就只关注图里括号中的那一项,这一项的意思可以近似的看成是预测值与实际值之间的方差。
δ ( l ) j δ^(l)_j δ(l)j可以被看作是第I层第j项的a的误差。
δ是对于cost函数(预测值与实际值的方差)进行求z偏导之后的结果。
而我们的cost函数又是关于y(实际值)与h(预测值)的等式。其中h函数=g(z),所以说如果z的值改变了,那么就会影响到误差δ。
首先计算出
δ
(
4
)
=
a
(
4
)
−
y
(
4
)
δ^{(4)} = a^{(4)} - y^{(4)}
δ(4)=a(4)−y(4)
然后反向计算出,
δ
(
3
)
,
δ
(
2
)
δ^{(3)}, δ^{(2)}
δ(3),δ(2),
其中
δ
2
(
2
)
=
δ^{(2)}_2 =
δ2(2)=
3.3 梯度检验:
采用近似估计:
因为我们求偏导求出来的是一个斜率,那我们可以在点的两边各取一个近似的值,然后画出图形,可以看见,这两个近似点所连接的红色线段与上面的蓝色线段非常的接近。所以我们可以通过计算这两个点所构成图形的对边比临边来近似估计真正点的导数。
当我们的θ不是一个实际值的时候,我们就可以用一下方法:
然后将得出的计算结果与反向传播得出的结果比较,看是不是近似的,若是近似的就表示结果是可信的。
如果将所有的θ都初始化为0,那么就会使得每个权重都相同,所以应该随机化参数。
3.4 实现的步骤:
- 随机初始化权重
- 使用前向传播来计算x的h函数值
- 使用代码去计算代价函数
- 使用后向传播来计算代价函数的偏导数
- 进行梯度检测