7 Sep

BytePiece:更纯粹、更高压缩率的Tokenizer

目前在LLM中最流行的Tokenizer(分词器)应该是Google的SentencePiece了,因为它符合Tokenizer的一些理想特性,比如语言无关、数据驱动等,并且由于它是C++写的,所以Tokenize(分词)的速度很快,非常适合追求效率的场景。然而,它也有一些明显的缺点,比如训练速度慢(BPE算法)、占用内存大等,同时也正因为它是C++写的,对于多数用户来说它就是黑箱,也不方便研究和二次开发。

事实上,Tokenizer的训练就相当于以往的“新词发现”,而笔者之前也写过中文分词最小熵系列文章,对新词发现也有一定的积累,所以很早之前就有自己写一版Tokenizer的想法。这几天总算腾出了时间初步完成了这件事情,东施效颦SentencePiece,命名为“BytePiece”。

点击阅读全文...

2 Aug

复分析学习1:揭示微分与积分的联系

笔者这段时间对复数尤其感兴趣,当然,严格来讲应该是复变函数内容,其中一个原因是通过它,我们可以把一些看似毫不相关的内容联系了起来,体现了数学的简洁美和统一美。我相当有兴趣的其中一个内容是实分析中的泰勒级数傅里叶级数。这两者都是关于某个函数的级数展开式,其中泰勒级数是用于一般函数展开的,其各项系数通过求n阶导数得到;傅里叶级数的对象是周期函数,其各项系数是通过定积分求得的。在实数世界里,两者毫不相关,但是,复分析却告诉我们:它们只是同一个东西!只是将其在不同的角度“投影”到实数世界里,就产生了不同的“物像”,以至于我们认为它们是不同东西而已。

我们直接来看一个变魔术般的运算:
我们知道,在实数世界里头,我们有
$ln(1+x)=x-\frac{x^2}{2}+\frac{x^3}{3}-\frac{x^4}{4}+...$,其中$|x| < 1$

点击阅读全文...

28 Sep

开始学习数学软件Scilab

其实很早之前我就想学习一款数学软件的使用,以前很感兴趣的是mathematica,也玩弄过一阵子,但毕竟在高中没有多大需要,也就没有坚持下来。更重要的是,这些软件都是要收费的。上了大学后,听了师兄姐对数学建模的讲述,发现他们基本上也是用mathematica或者matlab的,但这两个软件都是要收费的,我不大想用破解版本。既然我都已经用上了ubuntu了,那么我就该好好利用它。据说命令跟matlab很相似的软件是scilab,还有octave,不同的是这些都是开源免费的。

出于熟悉代码操作和数学软件编程的目的,我选择了学习scilab。虽然网上说octave与matlab的相似程度更高,但是我感觉scilab比octave用的更广一些,所以就用它。所谓“一理通百理明”,先专心学好一个。

下面是我编写的第一个scialb程序,利用威尔逊方法来进行素性测试。这个代码的主要目的是练习条件语句和循环语句,以及一些输出输入的技巧而已。程序本身比较丑陋。

//我的第一个scilab程序
//完成于2012.09.27

label1=['p:';];  //定义标签
B=x_mdialog(['本程序使用威尔逊方法判断进行素数测试。';'请输入要判断的数'],label1,['127';]);  //输入框
p=evstr(B(1));  //提取输入框里边的数字进行赋值
i=1;
j=1;
q=p-1;
while i<q
    j=j*i;
    j=modulo(j,p);//这个是模函数。
    i=i+1;
end
if j==1
    messagebox(['这是一个素数';],['测试结果']);  //输出,其中后边的“测试结果”是输入框的标题
else
    messagebox(['这是一个合数';],['测试结果']);
end

点击阅读全文...

25 Apr

学习场论(电磁场、重力场)

本博客的文章其实一定程度上反映了我在该时期的学习研究,所以我觉得写blog是一件很惬意的事情,它记录着我的成长历程。读者可能留意到,我上学期说对量子力学很感兴趣,也算是入了一点点门。这学期开学初表示对摄动理论方面的知识很感兴趣,也研究了一两个星期。再后来就将学习重点放在了相对论上面了。现在呢?我在学习朗道的《场论》,主要先学习电磁场(电动力学)。

有的读者可能比较无语:你怎么变来变去,学习不是贵在精而不在多吗?

点击阅读全文...

6 Jun

闲聊:神经网络与深度学习

神经网络

神经网络

在所有机器学习模型之中,也许最有趣、最深刻的便是神经网络模型了。笔者也想献丑一番,说一次神经网络。当然,本文并不打算从头开始介绍神经网络,只是谈谈我对神经网络的个人理解。如果希望进一步了解神经网络与深度学习的朋友,请移步阅读下面的教程:
http://deeplearning.stanford.edu/wiki/index.php/UFLDL教程

http://blog.csdn.net/zouxy09/article/details/8775360

机器分类

这里以分类工作为例,数据挖掘或机器学习中,有很多分类的问题,比如讲一句话的情况进行分类,粗略点可以分类为“积极”或“消极”,精细点分为开心、生气、忧伤等;另外一个典型的分类问题是手写数字识别,也就是将图片分为10类(0,1,2,3,4,5,6,7,8,9)。因此,也产生了很多分类的模型。

点击阅读全文...

29 Nov

轻便的深度学习分词系统:NNCWS v0.1

好吧,我也做了一回标题党...其实本文的分词系统是一个三层的神经网络模型,因此只是“浅度学习”,写深度学习是显得更有吸引力。NNCWS的意思是Neutral Network based Chinese Segment System,基于神经网络的中文分词系统,Python写的,目前完全公开,读者可以试用。

闲话多说

这个程序有什么特色?几乎没有!本文就是用神经网络结合字向量实现了一个ngrams形式(程序中使用了7-grams)的分词系统,没有像《【中文分词系列】 4. 基于双向LSTM的seq2seq字标注》那样使用了高端的模型,也没有像《【中文分词系列】 5. 基于语言模型的无监督分词》那样可以无监督训练,这里纯粹是一个有监督的简单模型,训练语料是2014年人民日报标注语料。

点击阅读全文...

7 Oct

深度学习中的Lipschitz约束:泛化与生成模型

前言:去年写过一篇WGAN-GP的入门读物《互怼的艺术:从零直达WGAN-GP》,提到通过梯度惩罚来为WGAN的判别器增加Lipschitz约束(下面简称“L约束”)。前几天遐想时再次想到了WGAN,总觉得WGAN的梯度惩罚不够优雅,后来也听说WGAN在条件生成时很难搞(因为不同类的随机插值就开始乱了...),所以就想琢磨一下能不能搞出个新的方案来给判别器增加L约束。

闭门造车想了几天,然后发现想出来的东西别人都已经做了,果然是只有你想不到,没有别人做不到。主要包含在这两篇论文中:《Spectral Norm Regularization for Improving the Generalizability of Deep Learning》《Spectral Normalization for Generative Adversarial Networks》

所以这篇文章就按照自己的理解思路,对L约束相关的内容进行简单的介绍。注意本文的主题是L约束,并不只是WGAN。它可以用在生成模型中,也可以用在一般的监督学习中。

L约束与泛化

扰动敏感

记输入为$x$,输出为$y$,模型为$f$,模型参数为$w$,记为
$$\begin{equation}y = f_w(x)\end{equation}$$
很多时候,我们希望得到一个“稳健”的模型。何为稳健?一般来说有两种含义,一是对于参数扰动的稳定性,比如模型变成了$f_{w+\Delta w}(x)$后是否还能达到相近的效果?如果在动力学系统中,还要考虑模型最终是否能恢复到$f_w(x)$;二是对于输入扰动的稳定性,比如输入从$x$变成了$x+\Delta x$后,$f_w(x+\Delta x)$是否能给出相近的预测结果。读者或许已经听说过深度学习模型存在“对抗攻击样本”,比如图片只改变一个像素就给出完全不一样的分类结果,这就是模型对输入过于敏感的案例。

点击阅读全文...

14 Feb

多任务学习漫谈(三):分主次之序

多任务学习是一个很宽泛的命题,不同场景下多任务学习的目标不尽相同。在《多任务学习漫谈(一):以损失之名》《多任务学习漫谈(二):行梯度之事》中,我们将多任务学习的目标理解为“做好每一个任务”,具体表现是“尽量平等地处理每一个任务”,我们可以称之为“平行型多任务学习”。然而,并不是所有多任务学习的目标都是如此,在很多场景下,我们主要还是想学好某一个主任务,其余任务都只是辅助,希望通过增加其他任务的学习来提升主任务的效果罢了,此类场景我们可以称为“主次型多任务学习”。

在这个背景下,如果还是沿用平行型多任务学习的“做好每一个任务”的学习方案,那么就可能会明显降低主任务的效果了。所以本文继续沿着“行梯度之事”的想法,探索主次型多任务学习的训练方案。

目标形式

在这篇文章中,我们假设读者已经阅读并且基本理解《多任务学习漫谈(二):行梯度之事》里边的思想和方法,那么在梯度视角下,让某个损失函数保持下降的必要条件是更新量与其梯度夹角至少大于90度,这是贯穿全文的设计思想。

点击阅读全文...