动手学深度学习-准备基础
动手学深度学习
基础知识:
第1章:深度学习背景
时间快,这块不是重点;要把动手编程变为重点。
机器学习是一门讨论各式各样的适用于不同问题的函数形式,以及如何使用数据来有效地获取函数参数具体值的学科。深度学习是指机器学习中的一类函数,它们的形式通常为多层神经网络。
起源:
自然法则,是从数据回归到自然定律,可以用线性模型完美表达的。(发现自然定律的过程,也可以认为是深度学习的过程。)
对于深度学习的认识,可以认为是数据分析的高度解读,将数据回归到规律上的过程。
赫布理论是感知机学习算法的原型,并成为随机梯度下降算法的基石:强化合意的行为、惩罚不合意的行为,最终获得优良的神经网络参数。
神经网络核心原则:
- 交替使用线性处理单元与非线性处理单元,它们经常被称为“层”。
- 使用链式法则(即反向传播)来更新网络的参数。
发展:
- 优秀的容量控制方法,如丢弃法,靠在整个网络中注入噪声而达到的,如训练时随机将权重替换为随机的数字。
- 注意力机制,使用了一个可学习的指针结构来构建出一个精妙的解决方法;(其在像机器翻译这样的任务中记忆整个句子,不如记忆指向翻译的中间状态的指针);这样容量储存空间会更大。
- 记忆网络和神经编码器—解释器这样的多阶设计使得针对推理过程的迭代建模方法变得可能(允许重复修改深度网络的内部状态,好像处理器在计算过程中修改内存一样)
- 生成对抗网络的发明 ,将采样部分替换成了任意的含有可微分参数的算法。这些参数将被训练到使辨别器不能再分辨真实的和生成的样本。(生成奔跑的斑马和生成名流的照片 )
特点
机器学习和深度学习的关系:
- 机器学习研究如何使计算机系统利用经验改善性能。
- 深度学习是具有多级表示的表征学习方法;表征学习关注如何自动找出表示数据的合适方式,以便更好地将输入变换为正确的输出。
深度学习模型也可以看作是由许多简单函数复合而成的函数。(通过多函数来表达复杂的变换)
端到端训练:
不是将单独调试的部分拼凑起来组成一个系统,而是将整个系统组建好之后一起训练。(自动优化的逐级过滤器)。
当数据多的时候,可以采用无参数模型(因为完全可以通过大数据来学习)
当数据少的时候,可以简化对现实的假设来得到实用的模型,采用含参数模型。
第2章:动手学深度学习的预备知识
知道如何使用笔记本运行代码
算法操作:
import torch
import numpy as np
#创建随机初始化的Tensor
x1 = torch.rand(5, 3)
print("随机初始化的Tensor:\n{}\n".format(x1))
#创建long型全为0的Tensor
x2 = torch.zeros(5, 3, dtype=torch.long)
print("long型全为0的Tensor:\n{}\n".format(x2))
#直接根据数据来构建的Tensor
x3 = torch.tensor([5.5, 3.3])
x4 = torch.tensor(np.array([5.5, 3.3]))
print("直接根据数据来构建的Tensor:\n{}\n".format(x3))
print("直接根据数据来构建的Tensor(numpy形式):\n{}\n".format(x4))
#通过先有Tensor来构建的Tensor
x = x2.new_ones(5, 3, dtype=torch.float64)
print("通过先有Tensor来构建的Tensor:\n{}\n".format(x))
#指定新的数据类型;本来是ones,给变成random形式了
x= torch.randn_like(x, dtype=torch.float)
print("指定新的数据类型:\n{}\n".format(x))
y = torch.rand(5, 3)
print("y and x + y ")
print("y={}".format(y))
print("x + y ={}".format(x + y))
#通过先有Tensor来构建的Tensor
x = x2.new_ones(5, 3, dtype=torch.float64)
print("通过先有Tensor来构建的Tensor:\n{}\n".format(x))
#指定新的数据类型;本来是ones,给变成random形式了
x= torch.randn_like(x, dtype=torch.float)
print("指定新的数据类型:\n{}\n".format(x))
#输出Tensor形状
print(x.size())
print(x.shape)
#修改Tensor的值
x = x2.new_ones(5, 3, dtype=torch.float64)
print("通过先有Tensor来构建的Tensor:\n{}\n".format(x))
x[1][2] = 2
print("修改后的Tensor:\n{}\n".format(x))
#求导
x = torch.tensor([[1., -1.], [1., 1.]], requires_grad=True)
out = x.pow(4).sum()
out.backward()
x.grad
结果:
随机初始化的Tensor:
tensor([[0.2630, 0.5941, 0.1872],
[0.1692, 0.8500, 0.2259],