简单神经网络算法的初次学习笔记
- 2026-11-15 11:18:47
简单神经网络算法的初次学习笔记神经网络算法的分层结构通常由输入层、隐藏层、输出层这三层组成,每个神经元包含权重、偏置和激活函数,通过加权求和与非线性变换产生输出。核心就是四步:1.随机初始化权重 2.前向传播:输入>>隐藏层>>输出层 3.反向传播:算误差>>从后往前算梯度>>更新权重 4.重复几千次,网络“学会”功能 本次目标是让神经网络学会“异或”,下面我逐步手算,只用一组训练样本(0,1)>>1,隐藏层只使用2个神经元,权重由我人为指定。 一、网络结构
二、初始权重 输入层>>隐藏层 人为指定权重:
人为指定偏置:
隐藏层>>输出层
三、前向传播 第一步:输入层>>隐藏层 第二步:隐藏层>>输出层 预测值:0.723,真实值:1 四、算误差 用均方误差的一半(方便求导): 五、反向传播 从误差出发,用链式法则算每个权重该调多少=误差x它对误差的“贡献”,梯度指向函数增长最快的方向,其大小代表该方向上的变化率。 第一步:输出层梯度 计算输出层这个神经元对总误差“负有多大责任”,以及该往哪方面调。 第二步:更新 隐藏>>输出的权重 w=w-学习率*误差对w的梯度 人为指定学习率 ŋ=0.1 第三步隐藏层梯度 h1的误差传回 h2的误差传回 第四步:更新 输入>>隐藏 的权重 w21(x2>>h1) w22(x2>>h2) 又因为x1=0,所以w11、w12的梯度都是0,不更新 六、这一轮结束后,权重变更
接下来再重复计算几千次,误差会一路降到接近0,网络就”学会“了。 把之前的手写标量算式全部改写成矩阵,然后写成程序如下
h1的加权求和z1=x1*w11+x2*w21+b1=0*0.1+1*0.2+0.1=0.3
h1过sigmoida1=1/(1+e^(-z1))=1/(1+0.7408)=0.574
h2的加权求和z2=x1*w12+x2*w22+b2=0*0.4+1*0.3+0.2=0.5
h2过sigmoida2=1/(1+e^(-z2))=1/(1+0.6065)=0.622
隐藏层输出:a1=0.574,a2=0.622输出层加权求和z_out=a1*w_h1o+a2*w_h2o+b_out=0.574*0.5+0.622*0.6+0.3=0.960
输出层过sigmoidy_pred=1/(1+e^(-z_out))=1/(1+0.3829)=0.723
E=(1/2)*(y_true-y_pred)^2=0.0384
1.误差E对y_pred求导əE/əy_pred=y_pred-y_true;预测值比真实值大了还是小了差多少
2.y_pred对z_out求导y_pred=sigmoid(z_out)sigmoid的导数:sigmoid'(z)=sigmoid(z)*(1-sigmoid(z))əy_pred/əz_out=y_pred*(1-y_pred)
3.链式法则拼接əE/əz_out=əE/əy_pred*əy_pred/əz_out=(y_pred-y_true)*y_pred*(1-pred)=δ_out带入数值δ_out=(0.723-1)*0.723*(1-0.723)=-0.0555
w_h1o更新əE/əw_h1o=əE/əz_out * əz_out/əw_h1o=δ_out*a1=-0.0319w_h1o_new = w_h1o-ŋ*əE/əw_h1o=w_h1o-ŋ*δ_out*a1=0.503
w_h2o更新w_h2o_new=w_h2o-ŋ*δ_out*a2=0.603
因为əE/əa1=əE/əz_out * əz_out/əa1=δ_out*w_h1o又因为a1=sigmoid(z1)əE/əz1=əE/əa1*əa1/əz1=δ_out*w_h1o* (a1*(1-a1))=δ_h1代入数值δ_h1=-0.0068
δ_h2=δ_out*w_h2o* (a2*(1-a2))=-0.0078
əE/əw21=əE/əz1*əz1/əw21=δ_h1*x2=-0.0068w21_new=w21- ŋ*əE/əw21= 0.20068
w22_new=w22-ŋ*əE/əw22=0.30078
import numpy as np# 一、指定权重#输入>>隐藏层 权重W1 = np.array([[0.1,0.4],# x1 >> h1,h2[0.2,0.3],# x2 >> h1,h2])#隐藏层偏置b1 =np.array([0.1,0.2])#隐藏层>输出层 权重W2=np.array([[0.5],#h1>>output[0.6],#h2>>output])#输出层偏置b2=np.array([0.3])
learning_rate = 0.1 #学习率#二、激活函数def sigmoid(x):return 1/(1+np.exp(-x))def sigmoid_deriv(a): #sigmoid的导数return a*(1-a)#三、输入数据X = np.array([0,1])y_true =np.array([1])epoch = 5#训练五轮for epoch in range(1,epochs+1):#四、前向传播hidden_z=np.dot(X,W1)+b1hidden_a=sigmoid(hidden_z)output_z=np.dot(hidden_a,W2)+b2pred=sigmoid(output_z)#五、算误差error =y_true-y_predss=0.5*float(np.sum(error ** 2))#六、反向传播delta_out=error* sigmoid_deriv(y_pred)delta_hidden =np.dot(delta_out,W2.T)*sigmoid_deriv(hidden_a)#七、算梯度dW2=np.dot(hidden_a.T,delta_out)dW1=np.dot(X.T,delta_hidden)#更新权重W2=W2 - learning_rate * dW2W1=W1-learning_rate *dW1
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。