经过前四周的学习,我们已经学完了《深度学习专项》的第一门课程《神经网络与深度学习》。让我们总结一下这几周学的知识,查缺补漏。
在有监督统计机器学习中,我们会得到一个训练集。训练集中的每一条训练样本由输入和输出组成。我们希望构建一个数学模型,使得该模型在学习了训练集中的规律后,能够建立起输入到输出的映射。
在深度学习中,使用的数学模型是深度神经网络。
神经网络一般可以由如下的计算图表示:
其中,每一个圆形的计算单元(又称神经元)一般表示 g ( W X + b ) g(WX+b) g(WX+b)这一组计算。 W , b W, b W,b是线性运算的参数, g g g是激活函数。
为了使神经网络学习到输入和正确输出的映射,我们要定义一个描述网络输出和正确输出之间差距的损失函数(即每个样本的网络输出与正确输出的误差函数的平均值),并最小化这个损失函数。这样,网络的“学习”就成为了一个优化问题。
为了对这个优化问题求解,通常的方法是梯度下降法,即通过求导,使每一个参数都沿着让损失函数减少最快的方向移动。
神经网络由输入层,隐藏层,输出层组成。计算神经网络的层数 L L L时,我们只考虑隐藏层与输出层。
令 x k ( i ) [ j ] x^{(i)[j]}_k xk(i)[j]表示某向量在第 i i i个样本第 j j j层的第 k k k个分量。
若每层的神经元个数为 n [ l ] n^{[l]} n[l],特别地,令输入的通道数 n x = n [ 0 ] n_x=n^{[0]} nx=n[0],则每层参数的形状满足 W [ l ] : ( n [ l ] , n [ l − 1 ] ) W^{[l]}:(n^{[l]}, n^{[l-1]}) W[l]:(n[l],n[l−1]), b [ l ] : ( n [ l ] , 1 ) b^{[l]}:(n^{[l]}, 1) b[l]:(n[l],1)。
常见的激活函数有sigmoid, tanh, relu, leaky_relu
。一般隐藏层的激活函数 g [ l ] ( l < L ) g^{[l]}(l < L) g[l](l<L)用relu
。对于二分类问题(输出为0或1),输出层的激活函数 g [ L ] g^{[L]} g[L]应用sigmoid
。
重复执行以下步骤:
前向传播:直接运行神经网络,并缓存中间计算结果 A , Z A, Z A,Z。
反向传播:倒着“运行”神经网络,根据求导链式法则,由网络输出求得每一个参数的导数。
梯度下降:对于每个参数 p = w [ l ] o r b [ l ] p = w^{[l]} \ or \ b^{[l]} p=w[l] or b[l],用 p : = p − α d p p := p-\alpha dp p:=p−αdp更新参数。其中 α \alpha α叫学习率,表示参数更新的速度。
images = np.reshape(images, (-1))
W = np.random.randn(neuron_cnt[i + 1], neuron_cnt[i]) * 0.01
b = np.zeros((neuron_cnt[i + 1], 1))
self.A_cache[0] = A
for i in range(self.num_layer):
Z = np.dot(self.W[i], A) + self.b[i]
A = get_activation_func(self.activation_func[i])(Z)
if train_mode:
self.Z_cache[i] = Z
self.A_cache[i + 1] = A
for i in range(self.num_layer - 1, -1, -1):
dZ = dA * get_activation_de_func(self.activation_func[i])(
self.Z_cache[i])
dW = np.dot(dZ, self.A_cache[i].T) / self.m
db = np.mean(dZ, axis=1, keepdims=True)
dA = np.dot(self.W[i].T, dZ)
self.dW_cache[i] = dW
self.db_cache[i] = db
for i in range(self.num_layer):
self.W[i] -= learning_rate * self.dW_cache[i]
self.b[i] -= learning_rate * self.db_cache[i]
学了几周,大家可能不太清楚自己现在的水平怎么样了。这里,我给大家提供了一个用于自我评价的标准,大家可以看看自己现在身处第几层。
升级语音:别说是用numpy,就算是用纯C++,我也能造一个神经网络!
《深度学习专项》第二门课的标题是《改进深度神经网络:调整超参数、正则化和优化》。从标题中也能看出,这门课会介绍广泛的改进深度神经网络性能的技术。具体来说,在三周的时间里,我们会学习:
目录还是比较凌乱的,让我们具体看一下每项主要知识点的介绍:
可以看出,第二门课包含的内容非常多。甚至很多知识都只会在课堂上提一两句,得通过阅读原论文才能彻底学会这些知识。但是,这门课的知识都非常重要。学完了第二门课后,我们对于深度学习的理解能提升整整一个台阶。让我们做好准备,迎接下周的学习。
欢迎大家继续阅读这些笔记。这些笔记也会在我的公众号:天才程序员周弈帆 上发表,公众号上的文章篇幅较短,可读性强一些。欢迎大家关注。