知识点
损失函数中的解分为两类:
- 解析解:误差最小化问题的解可以直接用公式表达出来
- 数值解:通过优化算法有限次迭代模型参数来尽可能降低损失函数的值
优化函数的两个步骤:
- 初始化模型参数,一般来说使用随机初始化。
- 我们在数据上迭代多次,通过在负梯度方向移动参数来更新每个参数.
两个向量相加的两种方法:
-
向量相加的一种方法是,将这两个向量按元素逐一做标量加法。
timer = Timer() c = torch.zeros(n) for i in range(n): c[i] = a[i] + b[i] '%.5f sec' % timer.stop()
-
向量相加的另一种方法是,将这两个向量直接做矢量加法。
timer.start() d = a + b '%.5f sec' % timer.stop()
后者比前者运算速度更快。因此,我们应该尽可能采用矢量计算
softmax与线性回归的区别与联系:
- softmax处理离散问题,线性回归处理连续问题,所以softmax主要处理分类问题。
- softmax与线性回归的输入差不多,但是它的输出个数是标签的类别数。输出值表示该类别的预测概率。
- softmax回归同线性回归一样,也是一个单层神经网络。由于每个输出o1,o2,o3的计算都要依赖于所有的输入x1,x2,x3,x4,softmax回归的输出层也是一个全连接层。
分类问题直接使用输出层的输出会产生两个问题:
- 输出层的输出值的范围不确定,我们难以直观上判断这些值的意义
- 真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量。
softmax运算符解决了以上两个问题。它利用下式将输出值变换成值为正且和为1的概率分布
多层感知机神经网络为什么要引入非线性变换?
我们先来看一种含单隐藏层的多层感知机的设计。
其输出O的计算为
也就是将隐藏层的输出直接作为输出层的输入。如果将以上两个式子联立起来可以得到
从联立后的式子可以看出,虽然神经网络引入了隐藏层,却依然等价于一个单层神经网络:其中输出层权重参数为WhWo,偏差参数为bhWo+bo。不难发现,即便再添加更多的隐藏层,以上设计依然只能与仅含输出层的单层神经网络等价。
几类激活函数
-
ReLU函数
ReLU(rectified linear unit)函数提供了一个很简单的非线性变换。给定元素xx,该函数定义为
可以看出,ReLU函数只保留正数元素,并将负数元素清零。 -
Sigmoid函数
sigmoid函数可以将元素的值变换到0和1之间:
-
tanh函数
tanh(双曲正切)函数可以将元素的值变换到-1和1之间:
利用pytorch生成多层网络的三种方法:
ways to init a multilayer network
# method one
net = nn.Sequential(
nn.Linear(num_inputs, 1)
# other layers can be added here
)
# method two
net = nn.Sequential()
net.add_module('linear', nn.Linear(num_inputs, 1))
# net.add_module ......
# method three
from collections import OrderedDict
net = nn.Sequential(OrderedDict([
('linear', nn.Linear(num_inputs, 1))
# ......
]))
摘抄
最后上一个摘抄了其他同学写的一个关于pytorch内部函数的小笔记:
- torch.ones()/torch.zeros(),与MATLAB的ones/zeros很接近。初始化生成均匀分布
- torch.rand(*sizes, out=None) → Tensor
返回一个张量,包含了从区间[0,1)的均匀分布中抽取的一组随机数。张量的形状由参数sizes定义。 - 标准正态分布torch.randn(*sizes, out=None) →Tensor
返回一个张量,包含了从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数。张量的形状由参数sizes定义。 - torch.mul(a, b)是矩阵a和b对应位相乘,a和b的维度必须相等,比如a的维度是(1, 2),b的维度是(1,2),返回的仍是(1, 2)的矩阵
- torch.mm(a, b)是矩阵a和b矩阵相乘,比如a的维度是(1, 2),b的维度是(2, 3),返回的就是(1, 3)的矩阵
- torch.Tensor是一种包含单一数据类型元素的多维矩阵,定义了7种CPU tensor和8种GPU tensor类型。
- random.shuffle(a):用于将一个列表中的元素打乱。shuffle() 是不能直接访问的,需要导入 random模块,然后通过random 静态对象调用该方法。
- backward()是pytorch中提供的函数,配套有require_grad。所有的tensor都有.requires_grad这个属性,可以设置这个属性。
x=tensor.ones(2,4,requires_grad=True) - 如果想改变这个属性,就调用tensor.requires_grad_()方法:
x.requires_grad_(False)
存疑
- 广播机制?
- view()?
- sys?
- num_work?
等我搞清楚了回来更新,哈哈哈。