自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 Optimization for Deep Learning

如果梯度计算出来非常接近于0的话,在SGD的情况下,不会再跟新卡在这个点上,但是SGDM,当前的Momentum会由上一次的Momentum和当前的Gradient决定,也就是说,当前的Gradient不仅会考虑到当前计算出的梯度本身还会考虑之前累积的Gradient。Adagrad有个问题,如果在一开始的Gradient太大的时候,Learning rate会很小,因为Gradient是从开始累积到当前时刻的,它可能没走几步就卡住。就会有比较大的值,Movement会很大,走的步子大一点。

2024-02-24 14:29:06 736 1

原创 Normalization,LayerNormalization和BatchNormalization

假设我们的损失函数在空间中是一个曲面,这个曲面可以被我们人为的切出等高线,在采用梯度下降算法的时候,我们沿着梯度反方向迭代(梯度方向与等高线垂直),到最后我们会抵达上图曲面的最低点。在上面的两幅图中忽略坐标值,观察损失函数曲面在空间中的形状,把它们比作山坡,我们人在山顶,很明显左图下山的路一眼就能看清,右图下山的路需要边走边观察改变下山路线,一般的情况下左图是会比右图更快更容易到达山底的。

2024-02-21 18:44:42 1083

原创 transformer-Attention is All You Need(二)

现在就以这个作为例子,输入经过词嵌入和位置编码后结合在一起作为encoder的输入,这里不再具体讨论encoder内部的具体过程,encoder会输出包含语义信息的张量memory,即下图中的K_encdec和V_encdec,这两个值会输入到decoder中的每一个解码器层中的第二个多头注意力子层。用编码器输出的K,V与上一个子层输出的Q做注意力计算,同上,最后在经过第三个子层,同样需要先经过一个子层连接结构就完成了解码器层的工作,和编码器部分一样需要经过N层的解码器层堆叠组成解码器部分。

2024-02-19 19:40:44 1183 1

原创 transformer-Attention is All You Need(一)

掩码张量是一个尺寸不固定的的张量,里面只包含0或1两种值,表示遮掩和不遮掩(也可以是不遮掩和遮掩),把其他张量的对应位置上的值遮掩住。

2024-02-16 17:34:46 1164 2

原创 如何在我们的模型中使用Beam search

在上一篇文章中我们具体探讨了Beam search的思想以及Beam search的大致工作流程。根据对Beam search的大致流程我们已经清楚了,在这我们来具体实现一下Beam search并应用在我们的seq2seq任务中。

2024-02-14 12:28:53 705 1

原创 使用二分查找优化时间复杂度

按照这种方式我们可以一次舍去一整片区间,相比于遍历数组一次舍去一个数值,得到的时间复杂度为。根据if else里的条件,left只会在target的左边的区间内移动,不会越过target,也就是说left可以移动到的最右边的位置正好是target的开始位置(如果符合条件的target只有一个,则就是这个元素的位置);right同理,也会在右边的区间移动,不会越过target,right可以移动到的最左边的位置正好是target的结束位置(如果符合条件的target只有一个,则就是这个元素的位置);

2024-02-13 23:17:57 924 1

原创 束集搜索(Beam search)

在seq2seq任务重,传统的获取decoder输出的结果过程中,在每一个时间步上,我们只选择概率最大的那个词,作为当前时间步的输出,即等到解码器获取到 <EOS> 词元结束循环的时候,我们获取到的句子,不一定是最准确的,获得的这个句子可能不通顺。因为的策略,局部最优并不能获取全局最优的结果。

2024-02-06 02:26:31 829 1

原创 如何处理我们的文本数据成构建词表

target:{'PAD': 0, 'UNK': 1, 'SOS': 2, 'EOS': 3, '是': 4, '王': 5, '若': 6, '猫': 7, '的': 8, '。input :{'PAD': 0, 'UNK': 1, 'SOS': 2, 'EOS': 3, '呵': 4, '不': 5, '是': 6, '怎': 7, '么': 8, '了': 9, ...},每一个字对应的数字都应该是独一无二的,比如,['不', '是'] 会对应的转换为 [ 6, 4 ]这样的形式。

2024-02-03 16:28:28 801 1

原创 Teacher forcing

中,我们在训练的过程中,使用前一个时间步预测的结果作为当前时间步的输入,这样会导致某个时间步预测错误,导致后面的时间步也发生错误,为了防止这样的局面我们应该如何改进,提高模型的收敛速度?上述的这种机制就是Teacher forcing,就像是一个指导老师,在每一步都会对我们的预测结果都会进行纠正,防止出现一连串错误结果,从而加快模型收敛速度。在上一篇文章提及的字符串数字预测案例中,我们在decoder中使用的是上一步的预测输出值作为下一步的输入。

2024-02-02 00:02:08 346

原创 seq2seq编码器-解码器实现

总之,seq2seq模型通过encoder接收一个长度为N的序列,得到一个context vector ,然后由 decoder 把这一个 context vector 转化为长度为M的序列作为输出,从而实现了一个N to M的模型,用于处理输入序列和输出序列不同的任务,比如,文本翻译、文章摘要、问答等等。代码实现可参考seq2seq实现案例已上传仓库。

2024-02-01 14:24:17 2603 1

原创 快速上手LSTM

在普通的神经网络中,信息传递是单向的,在很多现实任务中,网络的输入不仅和当前时刻的输入相关,还可能和过去的一段时间输出相关。如时序数据(视频,语音,文本等),而且这些数据长度通常都是不固定的(前馈神经网络要求输入和输出维度固定),循环神经网络解决了这个问题。第一,RNN可以处理变长的输入,第二,RNN可以分析序列的顺序信息。因为它不仅可以接收自身的信息,还可以接收其他神经元的信息。以下有五种不同类型的RNN:如图,不同任务RNN类型不同,如文本分类属于,文本翻译属于。

2024-01-29 14:45:44 1649

原创 FastText模型原理

我们可以通过贝叶斯,随机森林完成文本分类或者是自己构建神经网络模型完成文本分类,例如之前提到的IMDB文本情感分类。也可以使用fasttext高效完成文本分类的任务。在这里我们介绍fasttext的原理和与其相关的原理。

2024-01-28 20:53:08 854 1

原创 双指针部分典型算法(三)

(思路)滑动窗口+哈希表,通常我们遇到字符串都需要用到哈希表,因为我们需要用哈希表来记住我们之前出现过的字符,如果是知道字符范围,我们可以用数组来模拟哈希表,但是如果我们不知道会出现什么样的字符,我们就可以直接用哈希表来帮完成记住这些字符和其出现的次数等等。(思路)滑动窗口+哈希表,包含的字符是小写字母,我们直接用两个数组模拟哈希表,记录下模式串p和窗口子串(窗口子串指滑动窗口里的这一个字符串,是主串的一个子串)中出现的字母。显而易见,因为是滑动窗口,它维持的是主串中的一个连续区间,所以通常是用在。

2024-01-24 19:48:23 1037 1

原创 word embedding是什么,word embedding之前需要做什么?

我们知道自然语言处理是让机器能够看懂并理解人类所说的语言,能够像人类一样进行交互,和人对话。从自然语言的角度看,NLP可以大致分为自然语言处理和自然语言生成这两部分,就是理解文本和文本生成。具体应用领域几乎覆盖日常生活,如提取文章摘要,文本情感分析,淘宝京东上机器人客服的智能问答,实体命名识别,知识图谱,信息检索等等。又比如说现在已经有方言的语音转文字技术。那具体实现起来该怎么样呢?我们总不能直接把一堆文字或者一段英文直接倒给计算机,计算机只能处理数字,那么我们就得把词给转换成可以供计算机计算的数。

2024-01-22 22:56:50 3587

原创 双指针和字符串部分的算法题

在这里,先对双指针做个总结,其实我觉得双指针最大的作用就是减少遍历次数,在数组,链表,字符串中都很常见的一种解决方法,对于数组我们更应该先想到它能否变为有序数组,因为在有序的数组中我们处理会更加便捷,比如说找最大的k个元素等等。当然,这种思路的时间复杂度会很高,我们可以进一步考虑,两数相乘最大位数不超过两乘数位数之和,从后往前处理,和加法类似,我们要处理本位和以及本位的进位。在处理字符串问题的时候,我们不仅可以考虑左右双指针,也可以考虑从后往前遍历问题是否会更简单,总之,具体问题具体分析。

2024-01-21 20:07:26 888

原创 C++中的const和static关键字

C++中关键字的理解

2024-01-20 22:49:21 392

原创 双指针部分典型算法题(二)

容易被题目中的移出所误导,我们不需要将遍历过的移出数组,只需要保证不会再重复遍历到即可,所以我们仍可以先将乱序数组用快排处理为有序数组,再用left指针和right指针相向而行遍历,用k的值和两指针所指值之和的大小关系控制指针的移动,时间复杂度。根据我们的代码分析,其实这两个三元组所取到的0的位置是不一样的,确实可以说是没有取到重复元素的三元组,但取到的是重复值的三元组,我们如何去重呢?再看四数之和,其实就是三数之和的套娃,再将数组快排成有序数组之后,我们仍可以先固定一个数,问题就退化成三数之和问题。

2024-01-19 19:05:51 898 1

原创 双指针部分典型算法题(一)

证:假设慢指针在进环的时候和快指针的距离为N,每一次追击的时候慢指针走一步,快指针走两步,他们之间的距离变化为N-1,N-2,N-3,...,3,2,1,0,所以他们不会错过。对于这个典型的判环问题,我们可以使用快慢指针来解决,我们可以把他看成追击问题,快指针一次走两步,慢指针一次走一步,如果快指针和慢指针能相遇,那一定是由于链表中存在环。所以,当N为偶数的时候表明,这一圈就能够追上,当N为奇数的时候表明,这一圈会错过,下一圈的时候距离更新为N = S-1,能否追上取决于N的奇偶性。

2024-01-18 11:30:00 1048 1

原创 初始化列表的用处

关于初始化列表和一些容易和构造函数混淆处的理解

2024-01-17 10:30:00 540

原创 C++中的模版

这两次调用的函数是不一样的,首先不会调用这个函数模版,函数模版会根据类型实例化生成对应类型的函数,分别是void swap(int& x1,int& x2){ ... } 和 void swap(char& x1,char& x2){ ... }。在这里可以看出,我们定义了栈的结构体,但我们在具体使用的时候需要自己调用栈的初始化和销毁函数,不仅仅是栈需要这么做,链表,二叉树,图等等基本上都需要我们这么做,不仅麻烦而且往往容易遗漏;因此我们可以将栈封装起来,将成员变量私有化,防止在类外对成员数据的修改。

2024-01-16 15:47:15 454 1

原创 new和delete与malloc和free的区别

关于内存管理部分的一些理解

2024-01-15 18:37:00 491 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除