全网最简单易懂的一篇文章,神经网络(Neural Network)入门级学习笔记

神经网络起源于上世纪五、六十年代,当时称之为“感知机”。神经网络主要由输入层、隐藏层、输出层所构成,其实质是一个一个端到端的黑盒,可解释性比较差。
在这里插入图片描述

一、前言

一个经典的神经网络结构如下图所示,蓝色代表输入层,红色代表隐藏层,黑色代表输出层,输入层为3个维度,隐藏层为4个维度,输出层为2个维度。其中,输入层和输出层的维度固定,唯有隐藏层的维度和层数不固定。
在这里插入图片描述
thinging?如下图的网络结构:
在这里插入图片描述
输入层(第0层)3个维度
隐藏层1(第1层)4个维度
隐藏层2(第2层)2个维度
输出层3(第3层)1个维度
下文将从前向传播等展开对神经网络的剖析。

二、前向传播

上文知道了神经网络的构成是层与层之间的联系,那层与层之间是如何正方向传递的呢?我们对上图进行放大:
在这里插入图片描述
放大黑色标记部分:
在这里插入图片描述
前一层传递到后一层的某一个神经元的公式:
T = x1w1+x2w2+x3*w3
再经过激活函数转化,得到J,然后再传递给下一层。

激活函数是什么?

神经网络中重要知识点之一:激活函数。
没有激活函数的神经网络只能反映线性变换;引入激活函数可以反映非线性的关系。大多数情况下需要激活函数,只有极少数当x与y只有线性关系时,可以不用激活函数。
主流的激活函数有sigmiod、tanh、Relu(用的较多),当然阿里等公司也提出了一些激活函数。
关于激活函数的知识点笔者在另一篇博文中写的比较详细:
在神经网络中常用的激活函数

基于numpy模拟简易的前向传播

import numpy as np

#初始化网络,设定权重和偏置
def init_netword():
    network = dict()
    network['W1'] = np.array([[0.3,0.3,0.7],[0.3,0.6,0.9]])
    network['b1'] = np.array([1,1,0.7])
    network['W2'] = np.array([[0.2,0.2],[0.3,0.3],[0.7,0.7]])
    network['b2'] = np.array([2,7])
    network['W3'] = np.array([[0.3,0.4],[0.2,0.9]])
    network['b3'] = np.array([0.2,0.3])
    return network

#激活函数sigmiod
def sigmiod(x):
    return 1/(1+np.exp(-x))

#恒等函数,作为输出层的激活函数
def identity_function(x):
    return x

#前向传播
def forword(network,x):
    W1,W2,W3 = network['W1'],network['W2'],network['W3']
    b1,b2,b3 = network['b1'],network['b2'],network['b3']
    a1 = np.dot(x,W1)+b1
    z1 = sigmiod(a1)
    a2 = np.dot(z1,W2)+b2
    z2 = sigmiod(a2)
    a3 = np.dot(z2,W3)+b3
    z3 = sigmiod(a3)
    y = identity_function(z3)
    return y

#初始化网络
network = init_netword()

#设置输入层
x = np.array([2,3])

#前向传播
y = forword(network,x)
print(y)

三、反向传播

反向传播其数学推理在网上有很多,本文不做数学上的推理,只是解释一些反向传播通俗的理解。
一轮前向传播之后,其预测结果与y一定会有差异,差异可以用MSE、MAE等来衡量,那怎么样使第二轮的前向传播更靠近真实y值,这就需要反向传播来传递信息。
在这里插入图片描述
在这里插入图片描述
上图的迭代100次过程:

#使用numpy实现一个神经网络
import numpy as np

#n为样本大小,d_in为输入层维度,h为隐藏层维度(只有一层隐藏层)d_out为输出层维度
n,d_in,h,d_out = 1,1,1,1

#随机生成数据
x = np.array([100])
y = np.array([200])
#print(x,y)

#随机初始化权重
#输入层到隐藏层(100,50)
w1 = np.array([1.5])
#隐藏层到输出层(50,1)
w2 = np.array([1.5])
#设置学习率
learning_rate = 1e-6

#100次迭代
for i in range(100):
    #前向传播
    temp = np.dot(x,w1)

    y_pred = np.dot(temp,w2)

    #计算前向传播的损失函数
    loss = np.square(y_pred-y).sum()/n
    print(loss)

    #基于loss梯度,反向传播
    grad_y_pred = 2.0*(y_pred-y)
    grad_w2 = np.dot(temp.T,grad_y_pred)
    grad_temp_relu = np.dot(grad_y_pred,w2.T)
    grad_temp = grad_temp_relu.copy()
    grad_w1 = x.T.dot(grad_temp)

    # 更新权重
    w1 -= learning_rate * grad_w1
    w2 -= learning_rate * grad_w2

链接:
numpy模拟单个神经元
结果如下:截取部分
625.0
517.8184691406241
429.8432525175165
357.43330016699355
297.6863823860694

4.589414939595349e-05
3.884458379564834e-05
3.287788110244724e-05
扩展:同理,也可模拟多维x,y之间的神经网络
使用numpy实现一个nn
最后,欢迎学习深度学习的盆友们一起讨论。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝翔厨师长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值