实验目的
掌握机器学习的进阶-深度学习
实验原理
神经网络可以看作机器学习的一种进阶,与传统机器学习算法相融起到事半功倍的奇妙效果,本文只介绍简单的BP神经网络。
人工神经网络靠的是正向和反向传播来更新神经元, 从而形成一个好的神经系统, 本质上, 这是一个能让计算机处理和优化的数学模型. 而生物神经网络是通过刺激, 产生新的联结, 让信号能够通过新的联结传递而形成反馈. 虽然现在的计算机技术越来越高超, 不过我们身体里的神经系统经过了数千万年的进化, 还是独一无二的, 迄今为止, 再复杂, 再庞大的人工神经网络系统也不能替代我们的小脑袋. 我们应该感到自豪, 也应该珍惜上天的这份礼物.
神经网络的工作流程分为两步:前向传播和反向传播.前向传播我不再赘述
要想弄懂神经网络原理,必须搞定反向传播和链式求导法则。
一个简单的包含输入层、隐藏层、输出层的神经网络,我们选择sigmoid作为激活函数,选择均方差损失函数
(1)此时的反向传播公式为:
(2)链式求导法则
深度学习主流框架:
pytorch结构清晰主流,多用于学术上的研究。
tensorflow2.0+keras多用于工业级别应用,定制需求。
实验过程
问题程序的设计用到了房价数据集的预测(我这里没有采用任何激活函数,也就是说导数为1)
第一步,对样本明确预测输出值与损失函数
第二步,明确参数调整策略
第三步,计算输出层阈值的梯度
第四步,计算隐层到输出层连接权值的梯度
第五步,计算隐层阈值的梯度
第六步,计算输入层到隐层连接权值的梯度
第七步,引出归纳结论
import numpy as np
class DNN(object):
def __init__(self, x1, w11, x2, w12, w2, b1, b2):
self.x1 = x1
self.x2 = x2
self.w11 = w11
self.w12 = w12
self.b1 = b1
self.b2 = b2
self.w2 = w2
def forward(self):
self.a = self.x1 * self.w11.T + self.x2 * self.w12.T + self.b1
self.y = self.a * self.w2.T + self.b2
def backward(self, t, lr):
lr = 0.01
loss = 0.5 * np.multiply((self.y - t), (self.y - t))
loss = np.sum(loss)
print(loss)
w2_gradient = ((t - self.y).T * self.a)
b2_gradient = t - self.y
self.w2 += lr * w2_gradient
self.b2 += lr * b2_gradient
b1_gradient = (t - self.y) * self.w2
w11_gradient = ((t - self.y) * self.w2).T * self.x1
w12_gradient = ((t - self.y) * self.w2).T * self.x2
self.w2 += lr * w2_gradient
self.w11 += lr * w11_gradient
self.w12 += lr * w12_gradient
self.b2 += lr * b2_gradient
self.b1 += lr * b1_gradient
def guiyihua(x):
x_min = np.min(x)
x_max = np.max(x)
return (x - x_min) / (x_max - x_min)
if __name__ == '__main__':
x1 = np.matrix([[2104, 1600, 2400, 1416, 3000]])
x1 = guiyihua(x1)
x2 = np.matrix([[3, 3, 3, 2, 4]])
x2 = guiyihua(x2)
t = np.matrix([[400, 330, 369, 232, 540]])
t = guiyihua(t)
w11 = np.random.rand(6, 5)
w12 = np.random.rand(6, 5)
w2 = np.random.rand(5, 6)
b1 = np.random.rand(1, 6)
b2 = np.random.rand(1, 5)
dnn = DNN(x1, w11, x2, w12, w2, b1, b2)
for i in range(10000):
dnn.forward()
dnn.backward(t, lr=0.0001)
实验结果
前几轮的损失函数明显减小趋势,不必迭代10000次,50轮就可以。
133.03991295961194
5.302694196873382
0.00791654422927087
8.267125818963879e-06
8.661433867102698e-09
9.086442818990344e-12
9.5375452504142e-15
1.0013460297898702e-17
1.051419738303274e-20
1.104204535797256e-23
1.1607949553371193e-26
1.3822014024878314e-29
1.756448109281159e-31
8.936314941956774e-32
批阅人 | |
---|---|
分数 | |
时间 | 2021年12月31日 |