看了李沐的博士这五年,心中感慨万千,哈哈哈,跟着沐哥学学。
机器学习通常是写一个灵活的程序,一个模型,用数据来训练即系学习模型,利用数据编程。
机器学习四个要素:数据、转换数据的模型、衡量模型好坏的损失函数和一个调整模型权重来最小化损失函数的算法。
监督学习和非监督学习
监督学习通常是训练数据,对数据分类标注,最后结果是每幅图片会被标注,而非监督学习主要是聚类,把一堆数据点分成若干类,从而使得同类数据点相似。
线性回归-最简单的神经网络
神经网络是由一个节点(神经元)和有向边组成的集合,一般把一些节点组成层,每一层使用下一层节点作为输入,并输出给上一层节点使用,为了计算节点值,我们将输入节点做加权和,然后再加上一个激活函数。线性回归两层神经网络,如下
这个怎么说呢,就是输入到输出中间有某种关系,这个把数据塞进去之后,不断的去寻找校正这个关系,找出输入到输出之间一个大致关系。加标注的图片训练集也是,图片是输入,标注是输出,找出这两个之间的关系。当有新的输入时,经过这个模型出来的输出就是之前输出多代表的意思。
上面那个是单类输出的,只有一层,看看下面,多类输出,和多个隐藏层的。
下面是多层感知机,中间加入了隐藏层
欠拟合与过拟合,无法得到比较低的训练误差叫做欠拟合,训练误差远远小于泛化误差叫做过拟合,在模型和数据集上要好好选择。
一般高阶多项式函数比低阶多项式函数具有更强的拟合能力,这样就会在训练数据集上得到比较低的训练误差,但是过高的拟合会导致过拟合,从而导致泛化误差比较大,也就是太符合训练数据集了,最后导致测试数据集不是很符合了。
下图是一模型复杂度和误差的关系
还有一个就是训练数据集的大小
训练数据集过小,特别是比模型参数数量更小时,过拟合更容易发生,其它趋势,训练数据集越大都会越小的
一阶多项式拟合又叫线性拟合
- 正则化来应对过拟合
loss加上模型参数平方,最后使得整体最小化,这样可以消除过拟合的影响。
丢弃法应对过拟合,主要是对输入层或者隐藏层做以下操作:
- 随机选择一部分该层的输出作为丢弃元素
- 把丢弃元素乘0
- 把非丢弃元素拉伸
监督式学习,训练模型,模型输出和真实结果相比,不断调整模型参数,然后使得模型预测结果达到预期的准确率,常见的监督式学习应用场景是分类和回归,常见算法有LR和BPNN
非监督式学习就和监督式学习不一样,费监督式学习主要是聚类.
机器学习的主要算法
- 回归算法,试图采用对误差的衡量来探索变量之间的关系的一类算法,回归算法是统计机器学习的利器。
- 基于实例的算法,KNN算法,SOM算法(自组织映射算法)
- 决策树算法,根据数据的属性采用树结构建立决策模型,决策树模型常常用来解决分类和回归问题。
- 贝叶斯算法,基于贝叶斯定理的一类算法,主要解决分类和回归问题。
- 基于核的算法把输入数据映射到一个高阶的向量空间,在这些高阶向量空间里,有些分类或者回归问题能够更容易的解决。常见算法包括:支持向量机(SVM),径向基函数(RBF),以及线性判别分析(LDA)
- 聚类算法,对数据进行聚类,归类,按照最大的共同点将数据进行归类。常见算法包括K-Means算法和EM算法
- 人工神经网络,模拟生物神经网络,是一类模式匹配算法。其中深度学习就是其中一类算法,重要的人工神经网络算法包括:感知神经网络,反向传递,Hopefield网络。
- 深度学习,
机器学习是面向数据编程的,通常就是使用一个模型来不断的训练达到预期的效果。成功的机器学习有四个要素:数据、转换数据的模型、衡量数据好坏的损失函数、和一个调整模型权重来最小化损失函数的算法。最小化损失函数,不一定能保证测试集数据的输出表现良好,这里就存在训练误差和测试误差。
优化算法
最小化损失函数的一种算法,现在比较常见的是SGD随机梯度下降,将参数向减小损失的方向调整。
- 回归分析是监督学习里最简单的一类任务,输入时任意离散或者连续的,单一或多个变量,输出是连续的数值。Netflix的一百万大奖就是你的了;预测病人会在医院停留的时间也是一个回归问题。一条经验就是,问题中如果包含“多少?”,这类问题一般是回归问题。“这次手术需要几个小时?”……回归分析。“这张照片里有几只狗?”……回归分析。不过,如果问题能够转化为“这是一个____吗?”,那这很有可能是一个分类,或者属于其余我们将会谈及的问题。
- 回归分析所关注的预测可以解答输出为连续数值的问题,当预测的输出是离散的类别时,这个监督学习任务就叫做分类。
- 标注,比如一张图片中有多种物体,对物体进行标注,而不是简单的对整个图片进行分类。
- 强化学习RL,用机器学习开发一个能与周围环境交互并产生影响的智能体,比如AlphaGo击败了围棋世界冠军,和周围环境有交互,从环境收到观察数据,智能体做出action,最后从环境获得一个奖励,RL智能体的行为受到策略约束。
机器学习过程
- 初始化一个模型
- 训练集进入模型,其中包括数据和label,然后数据进入模型得到的输出和label进行比较,得到损失函数,更新模型参数使得损失往小的方向发展,不断进行迭代,直到模型达到预期的要求。
成功的机器学习有四个要素:数据、模型、损失函数、减小损失函数的算法。复杂的非线性模型比其他机器学习需要更多的数据。
机器学习中比较常见的优化损失函数的算法是SGD,梯度下降。损失函数关于模型参数的梯度指向一个可以降低损失函数的方向,每次都是通过反向梯度来更新模型参数从而优化损失函数。
线性回归从0开始
线性回归和分类还不是一样的,回归问题的输出是连续的,比如输出是多少,预测输出多少,分类通常问题是这个是什么吗?
线性模型是最简单的神经网络,一个神经网络就是由节点(神经元)和有向边组成的集合,为了计算一个节点值,我们将输入节点值做加权和,然后再加上一个激活函数。
下图所示是线性回归的神经网络,两层结构,第一层是输入(从下往上),每个节点对应输入数据点的一个维度,第二层是输出节点。
输入有几个特征就对应几个节点,然后每个节点都有权重,下一层输出节点是上层节点加权和然后还有位移还有激活函数最后得到输出,多层节点也是这样推导下去,每个层节点都是上层节点加权和加上位移还有激活函数什么的组成的。
一般多分类中,输出数量是类别个数,然后结果是输入每个类别的概率,他们相加为1,然后这种时候求损失函数,一般使用交叉熵损失函数,求对应那个输出概率的对数,如果概率为1的话,损失就为0,概率越大,输出就越小。这个可以很好的衡量损失函数。
学习率在gluon中现在发现都是0.1,这个和batch_size有关,一般是.1 / batch_size;
多层感知机如下图所示,多层就是在输入和输出之间加入了隐藏层,其中隐藏层的节点数也是由自己定义,然后的话,整个系统要是没有激活函数的话仍然是线性的,所以一般层之间加入了激活函数,而且是非线性的激活函数,激活函数就是当前节点的值不仅是上层节点的加权和加上位移还要经过这个激活函数进行处理。这个非线性函数在gluon中选取的是和0进行比较,如果比0大就取否则就为0,这个就是常见的激活函数relu = max(x, 0)。
有关拟合
欠拟合和过拟合,模型复杂度和数据量大小影响训练误差和测试误差(泛化误差)。其中如果模型比较复杂的话会导致过拟合,模型比较简单就会导致欠拟合,同样对于数据量来说,如果数据比较少的话就会导致过拟合,数据量大的话对泛化误差和训练误差来说都是有优化的作用的。
输入层是不用加到神经网络定义的,框架会判断输入具有多少特征,然后初始化权重。然后要做的就是进入神经网络不断的迭代优化这个模型,
正则化解决过拟合的问题,范数正则化,之前在训练的时候最小的化的是损失函数,现在最小化的是损失函数加上权重和偏移的平方,这里范数正则化试图惩罚较大绝对值的参数值。就是在过拟合学到的参数的绝对值要比真实参数的绝对值要大一些。要再减小这些,所以将参数的平方加到损失函数中了,这样加了一个会导致梯度变化,梯度是会增大的,在SGD中就可以使得下次的参数是比较小的,逐渐逼近那个最小的损失函数,达到最优。
丢弃法应对过拟合,在现代神经网络中,我们所指的丢弃法,通常是对输入层或者隐藏层做一下几件事情。
- 随机选择一部分该层的输出作为丢弃元素
- 把丢弃元素乘0
- 把非丢弃元素拉伸(保证期望)
- 模拟集成学习,集成学习就是将样本有放回的采样若干次,分别训练若干个不同的分类器,把这些分类器的结果集成一下作为最终分类结果。一个使用了丢弃法的神经网络就是相当于是原始神经网络的子集。只不过这些子集使用的是一套参数,这个相当于在对输入层或者隐藏层的参数进行正则化。
Kaggle比赛
K折交叉验证就是将数据分成K份,然后其中K-1份作为训练集剩下一个作为测试集进行训练测试,最后是将每个都轮流作为测试集进行训练,这种方法是为了得到可靠的稳定模型,之前看的这个gluon把数据搞成迭代器的形式进行随机排序,每次都是一个batch。