一、专业词汇
a hidden layer of the neural network 神经网络的隐藏层
a single hidden layer 单隐藏神经网络
activation function 激活函数
the linear activation function 线性激活函数
the identity activation function 恒等激活函数
rectified linear unit 修正线性单元ReLU
the leaky ReLU 带泄露的ReLU
number of hidden units 隐藏单元数
initialize the weights 初始化权重
w prime w'
a sub gradient of the activation function g(Z) 激活函数g(z)的次梯度
gradient descent working 梯度下降算法
initialize the weights 初始化权重
completely symmetric 完全对称
partial derivative terms 偏导项
二、编程技巧
()表示是第几个样本
[ ] 表示是处于第几层(layer)
第一层的a[1]用于第二层的输入:
np.sum(dZ^[2],axis=1,keepdims=true):keepdims=true 开启,保证不会输出那些秩为1的数组
logistic 回归,可以将权重初始化为0;但将神经网络的各参数数组全部初始化为0,再使用梯度下降算法,将完全无效:
下面情况会导致两个(多个)隐藏单元计算一样的函数,不管进行多少次梯度下降,导致多个隐藏单元在此并没有真正的意义:
而我们需要的是通过不同的隐藏单元,去计算不同的函数,所以需要随机初始化所有参数:
通常将权重矩阵初始化成非常小的随机值(非常小的原因是将Z的值避开非常平缓的地方,不让其值过大或者过小,使的梯度下降更快,学习的更快):
当训练的神经网络很深时,可能要选择0.01以外的数
W^[1]=np.random.randn((2,2))*0.01
三、思维
在神经网络中,需要多次计算,反复计算z和a的值,最后计算loss函数
一个神经网络包括:输入层(input layer)表示第0层、隐藏层(hidden layer)有多个节点、 输出层(output layer)只有一个节点,输出预测值y^,一般不把输入层看作一个标准的层,隐藏层和输出层是带有参数的,隐藏层中包含w^[1] b^[1],输出层包含w^[2] b^[2],
在有监督学习中,可以看到输入和输出,在训练集中,看不到中间节点的真正数值
用a^[0]表示输入、a代表activations(激活),意味着网络中不同层的值会传递给后面的层,即 输入层将x的值传递给隐藏层,隐藏层同样也会产生activations,将其记做a^[1],这里的a^[1]代表的是多维向量,在下面的例子中:
w^[1]是4*3的矩阵,4表示隐藏层中有4个节点,3表示有3个输入
b^[1]是4*1的矩阵
w^[2]是1*4的矩阵,1表示这一层有一个输出,4表示隐藏层中有4个节点
详细解释:
将四个等式向量化:
进一步得到:(在已知的单个训练样本中,计算神经网络的预测值)
将不同训练样本向量化:
将双下标的进行横向堆叠:
针对A[1]:
竖向扫描对应的不同的隐藏单元(不同的输入特征):
第一行第一个元素代表 第一个训练样本对应的第一个隐藏单元的激活函数
第二行第一个元素代表 第一个训练样本对应的第二个隐藏单元的激活函数
第三行第一个元素代表 第一个训练样本对应的第三个隐藏单元的激活函数
.............
横向扫描对应不同的训练样本:
第一行第二个元素代表 第二个训练样本对应的第一个隐藏单元的激活函数
第一行第m个元素代表 第m个训练样本对应的第一个隐藏单元的激活函数
.............
左边即为在单个训练样本中实现正向传播算法:
对几个样本进行正向传播计算:
为简化,将b的值设置为0
对于不同种类的激活函数的选择,大部分可以尝试使用ReLU,但是具体的什么函数更加适合,可以在我们的保留交叉验证数据集和开发集上跑一跑,看看哪个参数效果更好,就用哪个:
非线性的激活函数有:
sigmoid:
tanh():
tanh()的范围是-1到1,所以通过它得到的最终的结果的平均值更接近0,达到更佳的数据中心化的效果
在后续的例子中,除非结果是非0即1的二元分类的输出层的时候,输出层会选择sigmoid作为激活函数,其他情况一般不会选择sigmoid
每一层(layer)的激活函数可以不同,用[]上标加以区分
当z的值特别大或者特别小的时候,图像的斜率会接近于0,这样会拖慢梯度下降算法,更常用的是ReLU(默认的时候使用,或者不确定隐藏层用什么的时候使用),使用ReLU的好处在于:对于很多z空间,激活函数的导数、斜率和0相差很远,在实践中使用ReLU能使我们的神经网络的学习速度更快
ReLU:
the leaky ReLU:
为何一定要用非线性函数:假如用线性函数,则最后的a^[2]只是把输入的线性组合再次输出,假如第一个隐藏层都用线性激活函数,输出层用sigmoid,整个模型的复杂度和没有任何隐藏层的标准逻辑logistic回归是一样的。即线性隐层没有任何意义。
只有输出结果是一个实数的时候(比如房价),最后的输出层可以使用线性激活函数,隐藏层里面必须使用非线性激活函数
激活函数的导数:
sigmoid:
tanh() :
ReLU::
leaky ReLU:
等于0跟着谁是无关紧要的:
神经网络梯度下降:
神经网络的正向传播与反向传播: