机器学习中的损失函数
机器学习中的损失函数
损失函数用于确定预测值 \(\hat{y}\) 和实际值 \(y\) 之间的距离:
交叉熵损失
交叉熵损失函数利用的是负对数似然损失(negative log likelihood loss)。假设现在的输入为 \(x\),我们想要学习能够最大化正确标签的概率\(p(y|x)\) 的权重参数。对于二分类来说,仅有两个离散的输出(0和1),这是个伯努利分布(Bernouli distribution),我们可以将输入 \(x\) 对应的分类器得出的 \(p(y|x)\) 表示为:
上式就是指如果 \(y=1\) ,\(p(y|x)=\hat{y}\),如果 \(y=0\),\(p(y|x)=1-\hat{y}\)。
现在对上面的式子两边同时取对数:
取对数能够让计算更加简单,同时最大化正确分类的概率也会最大化概率的对数。上面的式子就是应该最大化的对数概率,为了将它变为损失函数(一般最小化),直接在式子前面加负号就得到交叉熵损失 \(L_{CE}\):
其中 \(\hat{y}=\sigma(w \cdot x + b)\)。最小化交叉熵损失 ...
hexo博客渲染器--pandoc
起因
博客的行内latex数学公式一直显示有问题,换了hexo-renderer-pandoc。
首先安装pandoc程序
根据自己的系统安装最新版,会少很多问题。(旧版本兼容有问题。)
pandoc下载链接 (打开稍微需要点时间。)
下载好直接安装。
安装hexo-renderer-pandoc渲染器
首先卸载自己原来的hexo渲染器
如果原来是hexo-renderer-marked: npm uninstall hexo-renderer-marked --save
如果原来是hexo-renderer-kramed: npm uninstall hexo-renderer-kramed --save
如果是其他的,依次类推。
安装hexo-renderer-pandoc
npm install hexo-renderer-pandoc --save
根据自己hexo博客的主题修改Mathjax为True
在主题相应的yml配置文件下修改mathjax的enable为true(打开mathjax)。
测试
hexo clean (清楚原来的缓存)
...
Latex数学公式
如何插入公式
LATEX 的数学公式有两种:行中公式和独立公式(行间公式)。行中公式放在文中与其它文字混编,独立公式单独成行。
行中公式可以用如下方法表示:
$数学公式$
独立公式可以用如下方法表示:
$$ 数学公式 $$
函数、符号及特殊字符
声调 / 变音符号
\dot{a}, \ddot{a}, \acute{a}, \grave{a}
\(\dot{a}, \ddot{a}, \acute{a}, \grave{a}\)
\check{a}, \breve{a}, \tilde{a}, \bar{a}
\(\check{a}, \breve{a}, \tilde{a}, \bar{a}\)
\hat{a}, \widehat{a}, \vec{a}
\(\hat{a}, \widehat{a}, \vec{a}\)
标准函数
指 ...
ACL2020:Dynamic Fusion Network for Multi-Domain End-to-end Task-Oriented Dialog
Dynamic Fusion Network for Multi-Domain End-to-end Task-Oriented Dialog
论文链接 论文代码
中文标题:面向多领域端到端的任务型对话系统的动态融合网络 这篇papar发表在ACL2020会议上,是哈工大SCIR(在中国,NLP的很顶尖的实验室)一作的文章。
第一遍粗读
粗读:浏览论文的结构和各个标题,之后看摘要(Abstract)和结论(Conclusion)。
论文结构:
粗读之后的问题:
shared-private network是个什么样的网络?
Dynamic Fusion Network又是一个什么样的网络?它是如何自动探索目标领域和每个领域的相关性的?
论文提出的模型如何只用少量标注数据快速适应到新领域的?
"Seq2Seq对话生成"具体是什么样的?
知识查询?动态融合?
论文里的对抗训练是什么样的?
Baseline里面的那几个模型又是什么样的?对比的各个评价指标是什么?
什么是消融?提前放个链接
第二遍精度论文中给出的图、表
Figure 1
下半张 ...
端到端
端到端
端到端(end-to-end)的方式是指源数据通过一个模型直接得到结果。同样的问题如果采用非端到端的方式则需要多个模型(模块)配合才能得到结果。
参考知乎
举例
打比方来说,写程序解决问题,"非端到端式"的程序做法是写出很多函数组合起来实现程序的功能;而"端到端式"的程序只有一个函数,这一个函数实现解决问题的方案。
在深度学习领域,"端到端式"有极大的意义,把所有的模块放在一起当成一个整体来训练,在前向推理的时候可以一次性从数据到结果。
误差理论说:误差传播的途径本身会导致误差的累积。多个阶段一定会导致误差的累积,深度学习的端到端式学习能减少误差传播的途径。
对比机器学习和深度学习
相对于深度学习,传统的机器学习的流程往往由多个独立的模块组成。比如在一个典型的自然语言处理问题中,包括分词、词性标注、句法分析(确定句子的语法结构如主谓宾或句子中词汇之间的依存关系)、语义分析(包含多义词的含义确定等)等多个独立的步骤,每个步骤是一个独立的任务,其结果的好坏会影响到下一步骤,从而影响整个训练的结果。上述是非端到端。
深度学习模型在训练的过程中,从输入端到输出 ...
贪心算法
贪心算法
贪心算法的Introduction
贪心算法(贪心策略)是对采用了贪心技巧的方法的总称。贪心技巧就是在解决问题的每一步都采用最优的选择(每次都选最好的--所以就好贪心了,really greedy)。
贪心算法解决问题
假设有下面的一个场景。A、B、C、D代表一个城市不同的角落,现在你站在A角落想要尽快到达D。
从A出发可以走两条路,通往B或者C,利用贪心技巧:尽快到达终点的话,我现在这一步就要时间短的路径,所以选择B,到B之后直接到D。
贪心算法存在的问题:假如有另外一个新的场景如下所示,利用贪心技巧的话,从A到D的路径便是:A -> B -> D,但是求出的路径(需要21min)并不是最快的,最快的是另外一条路径A -> C -> D (耗时15min)。
所以,由于没有考虑未来的情况,贪心算法有时并不会带来最优的解决方案,可能会带来一个低效的解决方案。一般来说,贪心算法往往比分治法(Divide and Conquer)、动态规划(Dynamic Programming)等效果差。
使用贪心算法时要注意分析贪心技巧是否对所有未 ...
动态规划
动态规划 (Dynamic Programming)
参考链接:https://www.zhihu.com/question/23995189/answer/613096905
0 从凑钱开始
凑钱问题
现在有1、5、10、20、50、100元面值的钞票,目标是用尽量少的钞票凑出某个金额Target。
尝试解决凑钱问题
既然要用尽量少的钞票,那么我们在凑钱的时候就先从面值大的开始,当面值大的钞票超过要凑的金额时选择面值小的钞票,依次下去。举例来说,如果要凑666元,那么先取100(还差566),再取100(重复5次),最后取出6张100元后(还差66),开始取50(还差16),开始取10(还差6),开始取5(还差1),开始取1(还差0),结束。
上述的策略(从大的面值开始,直到超标后开始选择小的面值)为贪心策略,贪心策略关注当前这一步做出来最优选择,所以贪心是一种只考虑眼前情况的策略,对于有些场景贪心策略的方案可能是低效的,例如,只有面值为1、5、11的钞票,需要凑出15元,贪心策略的步骤是:先拿一张11(还差4元),再拿4张1元,一种拿了五张。但是,正确的策略是 ...
编程题-柱状图中最大的矩形/最大矩形
编程题-柱状图中最大的矩形
来源:leetcode: 柱状图中最大的矩形 最大矩形
问题陈述
给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例
输入: [2,1,5,6,2,3]
输出: 10
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
求解
参考别人的解法 总结出自己的解法和代码如下。
1 暴力解法
求可能的矩形的最大面积,可以枚举以每个柱形为高度的最大矩形的面积,最后选择最大的矩形面积。
python实现: (94 / 96 个通过测试用例:对于很长的测试用例,python暴力解法代码时间通不过) 1234567891011121314151617181920class Solution: def largestRectangleArea(self, heights): max_area = 0 for i in ...
LRU Cache
LRU
LRU(Least Recently Used, 最近最少使用算法)是指当空间满了又有新的数据到来时淘汰数据的算法,它根据数据的历史访问记录把当前最久没有被访问的数据淘汰。
LRU依据的思想是:“如果数据最近被访问过,那么下一次被访问的几率更高”。也就是从另一个角度来看:“如果一个数据最近很久都没有被访问过,那么它在将来被访问的几率就很小”。
LRU的实现方式
1 数组
用一个数组来存储数据,给每一个数据项标记一个访问的时间戳。
每次插入新的数据时,先把原来数组中存在的数据的时间戳自增,并将新数据的时间戳置为0(最小值)插入到数组中。当数组的空间已满时,将时间戳最大的数据淘汰。
每次访问数组中的数据项的时候,将被访问的数据的时间戳置为0(最小值)。
2 链表
利用一个链表来存储数据。
每次插入新的数据的时候,将要插入的数据插入到链表的头部。当链表满的时候(按理说链表不会满,这里是指达到设定的长度等等),就将链表尾部的数据淘汰。
每次访问数据时,将被访问的数据移到链表的头部。
3 哈希表和双向链表实现
这一种实现方式时比上面两种实 ...
映射与哈希表
集合(Set)
集合与列表一样用于存放数据,但是集合和列表的不同之处在于: * 集合中的元素没有顺序,它就像一个bag。所以就没有下标这种标注顺序的性质。 * 集合中的元素都是独一无二的。
映射(Maps)
映射(Maps)是一个基于集合(Set)的数据结构,就像数组(array)是基于列表(list)的数据结构。
映射(Map) = <键(Key), 值(Value)>,映射的所有键(key)就是一个集合,映射里的键就像字典中的字一样,需要独一无二,但每个字(key)可能在字典中有多个不同的解释(value)。
python中的映射
在python中,映射(Maps)的概念对应于一个内置的数据结构——dictionary(字典),字典中存放键值对(key-value)。
dictionary(字典)
定义普通字典: 1234## 定义字典d = {}## 或者# d = dict()
向字典中加入键值对 key为课程,value为该课程是第几门课 123456d['math'] = 1d['En ...