Tiiktak's

Pytorch学习笔记_2_Autograd自动求导机制

Autograd 自动求导机制 PyTorch 中所有神经网络的核心是 autograd 包。 autograd 包为张量上的所有操作提供了自动求导。它是一个在运行时定义的框架,可以通过代码的运行来决定反向传播的过程,并且每次迭代可以是不同的。 通过一些示例来了解 Tensor 张量 torch.tensor是这个包的核心类。 设置.requires_grad为True,会追踪所有对于该张量的操作。计算完成后调用.backward(),可以自动计算所有的梯度,并自动累计到.grad属性中 事实上即使.requires_grad为True并不意味着.grad一定不为None 可以调用.detach()将该张量与计算历史记录分离,并禁止跟踪它将来的计算记录 为防止跟踪历史记录(和使用内存),可以将代码块包装在with torch.no_grad():中。这在评估模型时特别有用,因为模型可能具有requires_grad = True的可训练参数,但是我们不需要梯度计算。 Function类 Tensor 和 Function 互相连接并生成一个非循环图,它表示和存储了完整的计算历史。 每个张量都有一个.grad_fn属性,对张量进行操作后,grad_fn会引用一个创建了这个Tensor类的Function对象(除非这个张量是用户手动创建的,此时,这个张量的 grad_fn 是 None) leaf Tensors 叶张量 Tensor中有一属性is_leaf,当它为True有两种情况: 按照惯例,requires_grad = False 的 Tensor requires_grad = True 且由用户创建的 Tensor。这意味着它们不是操作的结果且grad_fn = None 只有leaf Tensors叶张量在反向传播时才会将本身的grad传入backward()的运算中。要想得到non-leaf Tensors非叶张量在反向传播时的grad,可以使用retain_grad() 如果需要计算导数,可以在Tensor上调用.backward():若Tensor是一个标量(即包含一个元素数据)则不需要为backward()指定任何参数, 但是如果它有更多的元素,需要指定一个gradient 参数来匹配张量的形状。 x = torch.ones(2, 2, requires_grad=True) print(x) # Output: # tensor([[1....

Pytorch学习笔记_1_tensor张量

Tensors Tensors与Numpy中的ndarrays类似 torch.new_* 与 torch.*_like 前者创建的对象会保持原有的属性(如dtype),但shape不同 >>> x = torch.zeros(5, 3, dtype=torch.double) >>> x.new_ones(2, 3) tensor([[1., 1., 1.], [1., 1., 1.]], dtype=torch.float64) >>> x.new_ones(2, 3, dtype=torch.long) tensor([[1, 1, 1], [1, 1, 1]]) 后者可以创建shape相同,属性不同的对象 >>> x = torch.zeros(5, 3, dtype=torch.double) >>> torch.ones_like(x) tensor([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.], [1., 1., 1.], [1., 1., 1.]], dtype=torch.float64) >>> torch.ones_like(x, dtype=torch.long) tensor([[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]) 获得size 使用size方法与Numpy的shape属性返回的相同,张量也支持shape属性...

神经网络模型的学习曲线

学习曲线:样本数量与误差 绘制 样本数量m 与 训练误差、交叉验证误差 的关系曲线 高偏差(欠拟合)high bias 高方差(过拟合)high variance ...

【应用机器学习】正则化与偏差、方差

在我们在训练模型的过程中,一般会使用一些正则化方法来防止过拟合。 但是我们可能会正则化的程度太高或太小了,即我们在选择λ的值时也需要思考与之前选择多项式模型次数类似的问题。 我们选择一系列的想要测试的λ值,比如这里选择 0-10之间的值,通常呈现2倍关系(如:0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10 共12个)。 我们同样把数据分为训练集、交叉验证集和测试集。 选择λ的方法 使用训练集训练出12个不同程度正则化的模型 用12个模型分别对交叉验证集计算的出交叉验证误差 选择得出交叉验证误差最小的模型 运用步骤3中选出模型对测试集计算得出推广误差 我们也可以同时将训练集和交叉验证集模型的代价函数误差与λ的值绘制在一张图表上: 当λ较小时,训练集误差较小(过拟合)而交叉验证集误差较大 随着λ的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加 ...

【应用机器学习】诊断偏差与方差

当你运行一个学习算法时,如果这个算法的表现不理想,那么多半是出现两种情况:要么是偏差比较大,要么是方差比较大。换句话说,出现的情况要么是欠拟合,要么是过拟合问题。 我们通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图表上来帮助分析: 对于训练集,当 d 较小时,模型拟合程度更低,误差较大;随着d 的增长,拟合程度提高,误差减小。 对于交叉验证集,当 d 较小时,模型拟合程度低,误差较大;但是随着 d 的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。 判断高偏差(欠拟合)或高方差(过拟合) 训练集误差和交叉验证集误差近似时:偏差/欠拟合 ​交叉验证集误差远大于训练集误差时:方差/过拟合 解决欠拟合与过拟合 欠拟合: - 增加网络结构,如增加隐藏层数目; - 训练更长时间; - 寻找合适的网络架构,使用更大的NN结构; 过拟合 : - 使用更多的数据; - 正则化( regularization); - 寻找合适的网络结构;...

【应用机器学习】模型选择和训练、验证、测试集

1. 重新划分数据集 其中60%作为训练集,20%作为交叉验证集(cross validation),20%作为测试集 2. 可以计算出三类数据的误差函数 3. 使用交叉验证集选择模型 选出交叉验证误差最小的一个模型 4. 利用测试集计算出推广误差 ...

【应用机器学习】评估一个假设

检验是否过拟合 将数据分成训练集和测试集 通常用70%的数据作为训练集,用剩下30%的数据作为测试集。 很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行洗牌,然后再分成训练集和测试集。 使用训练集对模型进行训练 可以得到一系列参数 theta 使用测试集对模型进行测试 使用测试集数据对模型进行测试,有两种方式计算误差 线性回归模型 利用测试集数据计算代价函数J 逻辑回归模型 除前述方法,还可使用一种 错误分类(misclassification error)(也称0/1错误分类 zero one misclassification error) 的方法...

训练神经网络的基本步骤

1. 选择一种网络结构 即选择神经元之间的连通模式 输入层与输出层单元个数由具体特征决定 隐藏层通常默认为1层;若为多层,则每个隐藏层单元个数应相等。通常隐藏层单元数越多越好 隐藏层单元数应与输入特征数相匹配 2. 随机初始化权重 通常把权重值初始化为接近0的很小的数 3. 执行前向传播FP算法 获得对应于每一个 xi 的 h_theta(xi)​ 4. 通过代码计算出代价函数 J(theta) 5. 执行反向传播算法 获得 J(theta) 对于 theta 的偏导​,即 步骤 3-5 6. 进行梯度检查 比较 通过反向传播得到的偏导数 与 通过数值计算得到的估计值 确保两种方法得到基本接近的两个值​ 注意在检查完毕后关闭梯度检查 7. 利用最优化算法与反向传播算法最小化 J(theta) 比如,使用最小梯度法...

正则化 Regularization

过拟合的问题 到现在为止,我们已经学习了几种不同的学习算法,包括线性回归和逻辑回归,它们能够有效地解决许多问题,但是当将它们应用到某些特定的机器学习应用时,会遇到过拟合(over-fitting)的问题,可能会导致它们效果很差。 可以使用一种正则化(regularization)的技术来改善或减少过度拟合的问题 在回归问题中 第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集; 第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质: 当我们用第三个模型预测新数据,可以看出,若给出一个新的值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;而中间的模型似乎是最合适的。 在分类问题中 就以多项式理解, x的次数越高,拟合的越好,但相应的预测的能力就可能变差。 处理过拟合问题 丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如PCA) 正则化。 保留所有的特征,但是减少参数的大小(magnitude) 代价函数 我们从之前的事例可以看出,正是那些高次项导致了过拟合的产生,所以我们可以通过让这些高次项的系数接近于0,我们就能很好的拟合。 所以正则化的基本方法就是在一定程度上减小高次项系数即参数theta的值 即在设定代价函数时,为高次项的系数设置一些惩罚,通过这样代价函数选择出的theta对预测结果的影响就比之前要小许多。 但如果我们不知道要对哪一个参数进行惩罚,我们可以对所以特征进行惩罚,并且让代价函数最优化的软件来选择这些惩罚的程度。于是得到了一个较为简单的能防止过拟合问题的假设 其中λ称为正则化参数(Regularization Parameter)。注:根据惯例,我们不对theta0进行惩罚。 经过正则化处理的模型与原模型的可能对比如图: 如果选择的正则化参数λ过大,则会把所有的参数都最小化了,导致模型变成 h(x) = theta0 ,也就是上图中红色直线所示的情况,造成欠拟合。 对于正则化,我们要取一个合理的λ的值,这样才能更好的应用正则化。 回顾一下代价函数,为了使用正则化,让我们把这些概念应用到到线性回归和逻辑回归中去,那么我们就可以让他们避免过度拟合了。 正则化线性回归 正则化线性回归的代价函数为: 如果我们要使用梯度下降法令这个代价函数最小化,因为我们未对theta0进行正则化,所以梯度下降算法将分两种情形: 分类 L1正则化(Lasso回归) 损失函数基础上加上权重参数的绝对值 L2正则化(岭回归) 损失函数基础上加上权重参数的平方和 需要说明的是:L1 相比于 L2 会更容易获得稀疏解 WHY->Click...

逻辑回归Logistic Regression

分类问题 在分类问题中,我们需要预测的变量y是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法 在分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误)。 将因变量(dependent variable)可能属于的两个类分别称为负向类(negative class)和正向类(positive class),则因变量y ∈ 0,1 ,其中 0 表示负向类,1 表示正向类。 如果我们要用线性回归算法来解决一个分类问题,对于分类,y取值为 0 或者1,但如果你使用的是线性回归,那么假设函数的输出值可能远大于 1,或者远小于0,即使所有训练样本的标签y都等于 0 或 1。尽管我们知道标签应该取值0 或者1,但是如果算法得到的值远大于1或者远小于0的话,就会感觉很奇怪。 所以我们在接下来的要研究的算法就叫做逻辑回归算法,这个算法的性质是:它的输出值永远在0到 1 之间 逻辑回归算法是分类算法,我们将它作为分类算法使用。有时候可能因为这个算法的名字中出现了“回归”使你感到困惑,但逻辑回归算法实际上真的是一种分类算法 假说表示 我们引入一个新的模型,逻辑回归,该模型的输出变量范围始终在0和1之间。 逻辑回归模型的假设是:h_theta(x) = g(theta'X) 其中:X代表特征向量,g代表逻辑函数(logistic function)是一个常用的S形函数(Sigmoid function),公式为:g(z) = 1 / (1 + exp(-z) Python代码实现 import numpy as np def sigmoid(z): return 1 / (1 + np.exp(-z)) 该函数图像为 合起来,我们得到逻辑回归模型的假设: 对模型的理解:g(z) = 1 / (1 + exp(-z) h_theta(x)的作用是,对于给定的输入变量,根据选择的参数计算输出变量=1的可能性(estimated probablity)即h_theta(x) = P(y=1 | x;theta)...