Vago Mundo

尘世闲游,听凭风引

    常用的迭代优化算法

    梯度下降和牛顿法

    引言 在学习机器学习的过程中,我们总是避不开优化问题,而且这些问题常常没有解析解。而在计算机算力不断增强的今天,迭代算法由于其计算的重复性和可并行性渐渐受到欢迎。这里我们会简单描述几种常见的迭代优化算法。 梯度下降法 引入 我们先从$\mathbb{R}$上的函数说起, 假设我们正处于$(1.5,2.25)$处,如果我们想要到达最小值点,那么必然是向下走,这里的“下”其实就是导数为...

    ProtoNN:Compressed and Accurate kNN for Resource-scarce Devices

    文献解读

    原文:http://proceedings.mlr.press/v70/gupta17a/gupta17a.pdf 摘要 一些应用程序需要在小型设备上进行实时预测,如物联网(物联网)传感器。这种应用程序需要具有小存储和计算复杂度的预测模型,而这对精度没有显著影响。在这项工作中,本文提出了一种新的算法ProtoNN,以解决在资源稀缺设备上实时和准确预测的问题。ProtoNN的灵感来自k-最...

    Softmax和交叉熵

    公式推导

    引言 周志华老师的《机器学习》的神经网络一章中,均方误差被作为损失函数,但在实际的分类问题中,我们常用交叉熵损失来作为目标函数,同时配合Softmax函数作为最后一层的输出来学习。本文将推导其反向传播公式,同时用自己设计的框架进行实验。 交叉熵损失和Softmax函数 交叉熵损失 交叉熵损失如下: \[L=-\dfrac{1}{l}\sum_{i=1}^l\sum_{c=1}^Cy...

    深度神经网络的反向传播

    数学推导

    引言 我们在之前已经推导出简单神经网络中数据传播(前向,反向传播)的公式,这里我们希望从头推导,并总结出多层反向传播的通式,从而构建多层的深度神经网络。 问题构建 我们这里以下面的四层神经网络为例: 从输入到输出依次有三个权重矩阵和三个偏执向量,我们分别设置为矩阵${A_{3\times5},B_{5\times4},C_{4\times3}}$​​​​和行向量${a_5,b_4...

    激活函数

    单隐层神经网络下的探究

    引言 按照《机器学习》西瓜书上的内容,我们实现了以Sigmoid为激活函数的单隐层神经网络。同时我们在之前的文章中说明了在代码框架中实现激活函数的替换是可行的。这里对激活函数进行一个总结并用我们设计的神经网络进行实验。 激活函数简介 在神经元模型中,神经元接收到来自其他神经元传递的输入信号,这些信号通过带权重的连接进行传递,“连接权重”相当于输入信号与神经元之间的“媒介”,当神经元接收...

    反向传播推导

    单隐层神经网络及拓展

    引言 $\text{BP}$算法是当今神经网络的核心,虽然Geoffrey Hinton表示自己对于反向传播「非常怀疑」,并提出「应该抛弃它并重新开始」,但它仍占据绝对地位,本文是作者在实现单隐层神经网络时所作的公式推导的总结,希望从各种方向拓展神经网络的用法,包括层数和激活函数。 基本的单隐层BP算法 我们在实现单隐层神经网络已经详细介绍了神经网络的BP算法的计算方法,在此不过多赘述...

    libSVM代码解读

    综述

    引言 早在学习SVM时,笔者便有亲手实现一个SVM的想法。后来发现其实现难度与数学技巧远高于单隐层神经网络,这对于只能写出一个二分类感知机的我不亚于小学生做高考题。在老师的建议下,笔者决定去阅读当前最流行的SVM代码库:libSVM和libLinear的源代码,不仅是学习SVM怎么写,也是学习一个合格的代码框架应该如何去设计。在此之前,笔者已经对SVM的SMO算法和实现技巧进行了一些零散的...

    libSVM源码解读(6)

    接口函数

    引言 我们在这里结束对libSVM代码级的讨论(数学上还有很多值得深挖的地方),我们这里讨论libSVM的接口函数,也是用户直接调用的方法。不少函数在libSVM源码解读(1)中提及,如果代码实现不难就将其略去。 模型训练 给定数据集进行训练,在libSVM中由svm_train完成。其逻辑用伪代码书写如下: def svm_train(problem): if problem i...

    libSVM源码解读(5)

    非接口函数

    引言 我们这里介绍libSVM中的非接口函数,还是下面的结构层次图: 我们已经在前面介绍了Solve类,现在介绍上面的函数。 求解具体问题 libSVM中有五个求解具体SVM问题的函数: solve_c_svc; solve_nu_svc; solve_one_class; solve_epsilon_svr; solve_nu_svr; 分别对应五种...

    libSVM源码解读(4)

    Solve类

    Solver类引入 我们这里会研究libSVM中的Solver类,它用于求解一个带线性约束的二次规划问题。 class Solver { public: Solver(){}; virtual ~Solver(){}; struct SolutionInfo { double obj; double rho; ...