0%

学什么

主要是从机器学习的工作流出发,每个阶段主要的工作和工业界流行的技术和概念

主要包括四个学习模块:

  1. 数据 数据获取、存储、清洗
  2. 模型 训练、迁移、多模态
  3. 部署
  4. 监控 可视化

学习计划

基本学习计划:

  1. 数据模块
    • 一天一个视频,慢慢学
  2. 模型模块
    • 机器学习、深度学习模块部分,快速过一遍
    • 模型验证,调优部分慢慢学,基础较差
  3. 部署 + 监控部分
    • 慢慢学

大概一共30多个视频,三周内学完(无意外的情况下),deadline 3-15

什么是前缀树(Trie)

In computer science, a trie, also called digital tree or prefix tree, is a type of search tree, a tree) data structure used for locating specific keys from within a set. These keys are most often strings), with links between nodes defined not by the entire key, but by individual characters). - wikepidea

前缀树(又叫做字典树)是一种特殊类型的多叉树,每条边代表一个一个字母,每个节点代表一个字符串(前缀),该字符串由从根节点到当前节点路径字母组成,由于节点间的父子关系,父节点字符串就相当于子节点字符串的前缀,因此称为前缀树

需要特殊注意的是前缀树的根节点由于没有父节点,代表空字符串

阅读全文 »

内容回顾

Beam Search:不同K的区别

  1. 小K值可能导致生成序列效果较差(语法上、语义上、流畅度上)
  2. 大K值虽然能够解决以上问题,但是会带来更多的计算成本,一定程度上减低NMT任务中的BLUE分数
    • 开放式问答任务中,更大的K可能导致 回答更加的宽泛(与原问题的关联度更低)

其他的解决方案

  1. Sampling-based decoding(与Beam search不同在于decoder每一步只需要追踪一个词)
    • Pure Sampling:每次随机选择概率分布中的某一个词,作为decoder输出词
    • Top-n Sampling:每次从前N个概率大小词语中选择某一个词,作为decoder输出词

Softmax temperature: 带温度系数的Softmax方法

$\tau$解释

在原始的Softmax函数中添加 temperature hyperparameter: $\tau$ .

  1. $\tau$ 起到一种平滑作用, $\tau$ 越大softmax计算得到的概率分布越平滑,t越小分布越不均匀
  2. 在训练开始将 $\tau$ 值设置较大,概率分布较为平滑,loss较大可以避免模型落入局部最优解,随着训练的进行,不断增大 $\tau$ 值,从而提升模型的效果。(某一个 $\tau$ 值并不影响模型的结果)

总结

阅读全文 »

869.重新排序得到 2 的幂

关键点是意识到2的幂次是有限

解法1-暴力回溯法

看到重排序就想到回溯法中的排列树问题,按照排列树的标准模板求解即可,注意排除出现前导零的情况,与

复杂度分析:

  • 时间复杂度:由于第i层共有N- i个选择,时间复杂度为O(N!)
  • 空间复杂度:递归深度为数字的长度,空间复杂度为O(N)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public boolean backTrace(int depth, int nLength, Long curNumber, int[] visited, int[] digits){
//所有情况选取完毕
if(depth == nLength){
return isTwoPower(curNumber);
}
for(int i = 0;i < nLength;i++){
//未选用过当前位置数字,前导数字不能为0
if(visited[i] == 0 && (depth != 0 || digits[i] != 0)){
visited[i] = 1;
if(backTrace(depth + 1, nLength, curNumber * 10 + digits[i] , visited, digits))
return true;
visited[i] = 0;
}
}
}
阅读全文 »

29. 两数相除

难点在于处理不能用long解决溢出问题

思路1:“二进制”减法(没有满足越界要求)

不能用除法,最简单的思路就是被除数(dividend)不断地减除数(divisor),直到减到剩余余数,相减的次数就是结果。该方法的问题就是时间复杂度太高,

  • 二进制优化,首先找到最大的n使得 $divisor 2^n < dividend$,每次减去 $ divisor 2^n, divisor 2^{n-1} ,divisor 2^{n-2} ……$,直到减到 $ divisor $
  • 实际上就是将原来的逐个减去,变为二进制减去(找商的二进制表示),由于任何数都能由二进制表示,所以该方法必定有解
  • 我的实现方法越界无法规避,只能用Long

复杂度分析:

没有分析的必要,由于只有32位整数,二进制一共只需要移动32次,时间复杂度与空间复杂度均为O(1)

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public int divide(int dividend, int divisor) {
long result = 0;
boolean isNegative = (dividend < 0 & divisor > 0) || (dividend > 0 & divisor < 0);
long temp = 1;

//首先绝对值求解
long denominator = (long)Math.abs((long)dividend);
long numerator = (long)Math.abs((long)divisor);
//首先找到最大元素
while(numerator << 1 <= denominator){
temp = temp << 1;
numerator = numerator << 1;
}
while(numerator >= Math.abs((long)divisor)){
if(denominator >= numerator){
denominator -= numerator;
if(isNegative)
result -= temp;
else
result += temp;
}
numerator = numerator >> 1;
temp = temp >> 1;
}
if(result > Integer.MAX_VALUE){
result = Integer.MAX_VALUE;
}
return (int)result;
}

思路2:条件约束+二分查找(答案的方法看得我头疼)

主要概念理解

self-Attention 自注意力机制

注意力机制介绍

自注意力机制与注意力不同点在于,自注意力机制在序列内部进行注意力的计算,每个词与相邻词进行F(Q,K)计算,当前词作为Q,临近词作为K,计算主力注意力分数后,进行嵌入向量的加权平均。

  • 一个词语的含义取决于上下文临近词语的含义(语境),自注意力机制解决了RNN无法抽取长距离信息的问题
  • 自注意力机制的计算可以通过矩阵运算实现并行化,解决了RNN无法并行优化的问题
阅读全文 »

课程大纲

预训练到来之前

词嵌入

迄今为止,我们主要使用包括Word2Vec,Glove等词嵌入向量,通过大量的数据预训练,提供给下游任务作为单词输入

之后我们遇到了 OOV(out of dic)和各种英语后缀不同导致单词含义不同得问题,传统预训练向量难以解决,引入了character-level的向量嵌入,如fastText。

然而以往的词向量存在两个问题

  • 以往的词向量嵌入不考虑上下文语境信息(或者说只考虑一种固定的语境),仅仅是固定的一个词向量,应用于不同的下游任务
  • 一个词不止有字面意思,还有包括词性,语法以及适用的语境等其他隐含信息,以往词向量只考虑了词的字面含义
阅读全文 »

语言学背景-划分更小单位的词

语音学和音韵学

语音学中将语音看作连续不断变化的声音流,音韵学将语音划分为不同的单位-音位(phoneme),同一个词的读法中音位的不同,对于不同群体理解可能有不同的含义。但是由于发音对于文本的理解并无意义,将此思想借鉴到单词形态分析上,形成了这种(parts of word)的思想

形态学:部分词(part of word)

如何对词进行拆分以更好地理解当前的单词(有点中文里的看半边猜词的味道,英文里去掉前缀后缀看词根)

  • 传统方式是将单词划分为最小语义单位
  • 使用字符级n-grams对单词进行拆分
阅读全文 »

从RNN到CNN

RNN的输入是一个完整的序列,其每一个时间步的输出均受到之前时间步的影响,RNN最终捕捉的是整个序列的特征信息,而一些NLP问题可能更加关注于句子的局部信息(例如本文分类),这一点是CNN的强项。

CNN解决NLP问题的出发点

按照窗口大小,在原序列上进行滑动,获得不同相同长度的子序列(语义可能无关),对于这些个子序列分别计算向量信息

  • 忽略了语法和语义信息,只是距离上的临近
  • 没有RNN的语法语义上的说服性(你就这样随便划分,提取出来的向量能有用?)
阅读全文 »

517. 超级洗衣机

贪心的思路并不难,就是太难想到了

思路1:邻居平分法(我自己的思路)

类似于最优解的区域法,针对每个洗衣机,将整个数组划分为左边右边两个子区域,计算左右两个区域的衣服总和,并定会存在总数小于或者大于 平均*区域数量 的区域,如果当前洗衣机衣服多,就将多余的衣服分给缺衣服的区域(给了邻居)

  1. 每遍历一次所有洗衣机等价于一次移动
  2. 最后一次遍历所有情况下划分的子区域,均满足 平均*区域数量 的性质

复杂度分析:

  1. 时间复杂度:每次平均都需要从头到尾遍历数组,共需要遍历结果次数的数组,时间复杂度为O(KN)
  2. 空间复杂度:额外开辟了一个存储前缀和的数组,空间复杂度为O(N)
阅读全文 »