Pytorch ——基础指北_零
软件环境:
- pytorch 1.10
- pycharm
- CUDA 10.2
提示:
使用配套教程体验更好:
youtobe教程 有需要搬运联系我
配套代码:
gitee-pytorch
神经元和激活函数
激活函数决定是否传递信号。在这种情况下,只需要带有一个参数(阈值)的简单阶梯函数。现在,当我们学习了一些新的东西(或未学习到什么)时,一些神经元的阈值和突触权值会发生改变。这使得神经元之间产生新的连接,大脑学会新的东西。
1943 年,McCulloch 和 Pitts 将上述情形抽象为上图所示的简单模型,这就是一直沿用至今的 M-P 神经元模型。把许多这样的神经元按一定的层次结构连接起来,就得到了神经网络。
一个简单的神经元如下图所示:

- a 1 , a 2 … a n a_1,a_2\dots a_n a1,a2…an 为各个输入的分量
- w 1 , w 2 ⋯ w n w_1,w_2 \cdots w_n w1,w2⋯wn 为各个输入分量对应的权重参数
- b b b 为偏置
- f f f 为激活函数,常见的激活函数有tanh,sigmoid,relu
- t t t 为神经元的输出
使用数学公式表示就是:
t
=
f
(
W
T
A
+
b
)
t = f(W^TA+b)
t=f(WTA+b)
其中
W
T
W^T
WT是表示矩阵的转置,将矩阵的行列互换得到的新矩阵称为转置矩阵,转置矩阵的行列式不变。
转置矩阵有四个性质:
(
M
T
)
T
=
M
(
M
+
N
)
T
=
M
T
+
N
T
(
k
M
)
T
=
k
M
T
(
M
N
)
T
=
N
T
M
T
(M^T)^T = M\\ (M+N)^T = M^T + N^T\\ (kM)^T = kM^T\\ (MN)^T =N^TM^T
(MT)T=M(M+N)T=MT+NT(kM)T=kMT(MN)T=NTMT
可见,一个神经元的功能是求得输入向量与权向量的内积后,经一个非线性传递函数得到一个标量结果。这里的转置是为了保持点积结果。
感知机
感知机由两层神经网络组成,输入层接收外界输入信号后传递给输出层(输出+1正例,-1反例),输出层是 M-P 神经元。

感知机的作用:
把一个n维向量空间用一个超平面分割成两部分,给定一个输入向量,超平面可以判断出这个向量位于超平面的哪一边,得到输入时正类或者是反类,当输入只有 X 1 X 2 X1X2 X1X2的情况下(输入一个坐标点),其输出就是对应到2维空间就是通过一条直线把一个平面分为两个部分的判断结果(输出在哪一个部分)。这本质上就是一个二分类模型。
多层神经网络
多层神经网络就是由单层神经网络进行叠加之后得到的,所以就形成了层的概念,常见的多层神经网络有如下结构:
- 输入层(Input layer),众多神经元(Neuron)接受大量输入消息。输入的消息称为输入向量。
- 输出层(Output layer),消息在神经元链接中传输、分析、权衡,形成输出结果。输出的消息称为输出向量。
- 隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。隐层可以有一层或多层。隐层的节点(神经元)数目不定,但数目越多神经网络的非线性越显著,从而神经网络的强健性(robustness)更显著。
全连接层:
全连接层:当前一层和前一层每个神经元相互链接,我们称当前这一层为全连接层。
思考:假设第N-1层有m个神经元,第N层有n个神经元,当第N层是全连接层的时候,则N-1和N层之间有1,这些参数可以如何表示?
从上图可以看出,全连接层实际上就是进行一次 Y = W x + b Y=Wx+b Y=Wx+b的变化,并将其从N维变换到M维,
激活函数
非线性二分类问题:
假设我们有这样一组数据,三角形和四边形,需要把他们分为两类
通过不带激活函数的感知机模型我们可以划出一条线, 把平面分割开
假设我们确定了参数w和b之后,那么带入需要预测的数据,如果y>0,我们认为这个点在直线的右边,也就是正类(三角形),否则是在左边(四边形)。但实际上这样解决并不是完美的,有个别蓝色方块会被识别成三角形。
多层神经网络:
如果一层网络没办法解决那么在前面的感知机模型中再增加一层会怎么样呢?
如图添加一层隐藏层:
对上图中的等式进行合并,我们可以得到:
y
=
(
w
1
−
11
w
2
−
1
+
⋯
)
x
1
+
(
w
1
−
21
w
2
−
1
+
⋯
)
x
2
+
(
w
2
−
1
+
⋯
)
b
1
−
1
y = (w_{1-11}w_{2-1}+\cdots)x_1+(w_{1-21}w_{2-1}+\cdots)x_2 + (w_{2-1}+\cdots)b_{1-1}
y=(w1−11w2−1+⋯)x1+(w1−21w2−1+⋯)x2+(w2−1+⋯)b1−1
实际上可以发现其还是保持得着线性的模式,这里需要补充一下什么是线性什么是非线性,
线性:
- 可加性:L(x+t)=L(x)+L(t)
- 一次齐次性:L(mx)=mL(x)
但是如果此时,我们在前面感知机的基础上加上非线性的激活函数之后,输出的结果就不在是一条直线。
如上图,右边是sigmoid函数,对感知机的结果,通过sigmoid函数进行处理,如果给定合适的参数w和b,就可以得到合适的曲线,能够完成对最开始问题的非线性分割。所以激活函数很重要的一个作用就是增加模型的非线性分割能力。我们可以通过调整W和B的大小来实现目标曲线的样子,如果单一一层无法满足要求就需要增加多层来实现目标。
常见的激活函数有:
常
用
的
三
种
激
活
函
数
:
S
i
g
m
o
d
∈
(
0
,
1
)
t
a
n
h
∈
(
−
1
,
1
)
(
与
S
i
g
m
o
d
不
同
的
是
可
以
输
出
负
数
)
R
e
L
u
∈
(
0
,
x
)
常用的三种激活函数:\\ Sigmod \in (0,1)\\ tanh \in (-1,1)(与Sigmod不同的是可以输出负数)\\ ReLu \in (0,x)\\
常用的三种激活函数:Sigmod∈(0,1)tanh∈(−1,1)(与Sigmod不同的是可以输出负数)ReLu∈(0,x)
当然激活函数含有这些效果
这些以后再说:
- 提高模型鲁棒性
- 缓解梯度消失问题
- 加速模型收敛等