Datawhale202401组队吃瓜——第四次整理

西瓜书,第五章 神经网络

一、神经元与神经网络

仿生的设计,神经元(数据),以参数的方式加权求和传递

二、感知机与多层网络

我特别喜欢将多层感知机与视觉神经进行对照,这两者无论是从结构还是功能上都有相似之处。这也是我觉得神经网络美妙之处。

三、反向传递的优化过程

如今假设有很多数据模型是 y=3a+2b+1, 神经网络是如何学习的?
比如a=1,b=2,y
应该是10
而假设最开始模型随机生成的模型是 1a+1b+0
,结果是5。如果损失函数是MAE,那么该组数据与真实值还有5的差异,就会通过反向传播的算法,返回去优化参数w1w2bias。
反向传播是基于梯度下降的方式,在以下最简单的网络中,可以迅速计算出绝对值损失是5,然后通过loss的反向传播,计算出到梯度下降的方向

import torch

# 定义输入张量,并设置 requires_grad 为 True,表示我们要计算梯度
x1 = torch.tensor(1.0, requires_grad=True)
x2 = torch.tensor(2.0, requires_grad=True)

# 定义真实模型
y_true = 3*x1 + 2*x2 + 1
#假设初始的参数模型是y = x1 + x2
y1 = x1 + x2
loss1= torch.abs(y_true - y1)

# 执行反向传播
loss1.backward(retain_graph=True)
# 访问梯度
print("在初始模型是y = x1 + x2时:")
print("x1 的梯度:", x1.grad.item(),"  x2 的梯度:", x2.grad.item())


#把x1,x2梯度清空计算另一种情况
x1.grad.zero_()
x2.grad.zero_()
y2=  x1+ 4*x2
loss2 = y_true - y2
loss2.backward()
# 访问梯度
print("在初始模型是y = x1 + 4*x2时:")
print("x1 的梯度:", x1.grad.item(),"  x2 的梯度:", x2.grad.item())

可以看出,显然梯度方向就是指向真实参数的方向(第二个方向正好相反可能是由于损失函数是绝对值导致的,当我把绝对值去掉,就能精准的找到梯度下降的方向)

当然这只是个简单的示例,真实的反向传播更为复杂。需要链式法则的求偏导。通过梯度下降(固定步长,变步长,动量等算法,解决高维空间的凸优化问题)

四、非线性之思

再反观这个图,如果全是如卷积层or全连接层,那么就算层数再多,也只是线性相加

重要的是,非线性的如RELUSigmond等激活函数,还有之后的CNN中的池化层等不同层的设计,使得引入非线性的数值。

特别是RELU,实则是有仿生的概念在里面:当我们大脑在进行不同工作的运算时,并不是所有神经元都会被激活,有部分仍然是抑制状态。

五、一些成熟网络的可视化推荐

也推荐一个CNN和transformer可视化的论文和网页:

Deep Visualization:可视化并理解CNN - 知乎 (zhihu.com)

CNN Explainer (poloclub.github.io)

Dodrio (poloclub.github.io)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值