主页

Fork Join Java 并行编程:轻松实现 Java 多线程

实现程序高性能的一个重要技术手段,就是将密集的任务分隔成多个可以并行执行的块,以便可以最大化利用机器的计算能力。如今多核处理器已经非常普遍,这给了我们发挥并发编程潜能的机会,因为多个线程可以在多个内核上并发执行。但是编写并发(并行)程序一向比较困难,因为你必须处理线程同步和共享数据的问题。 好在 java 平台在语言级别上对并发编程就提供了支持,Java SE 5 和 Java SE 6 通过引入了一组包提供并发模块,Java SE 7 又进一步增强它们。 早期版本的写法 Java 中普通线程的并发编程 从历史上来看,java 通过 java.lang.Thread 类和 java.lang.Runnable 接口来实现多线程编程,以确保代码对于共享的可变对象表现出正确性和...

阅读更多

果壳中的条件随机场

转载自《果壳中的条件随机场(CRF In A Nutshell)》,作者:苏剑林。 本文希望用尽可能简短的语言把 CRF(条件随机场,Conditional Random Field)的原理讲清楚,这里 In A Nutshell 在英文中其实有“导论”、“科普”等意思(霍金写过一本《果壳中的宇宙》,这里东施效颦一下)。 网上介绍 CRF 的文章,不管中文英文的,基本上都是先说一些概率图的概念,然后引入特征的指数公式,然后就说这是 CRF。所谓“概率图”,只是一个形象理解的说法,然而如果原理上说不到点上,你说太多形象的比喻,反而让人糊里糊涂,以为你只是在装逼。(说到这里我又想怼一下了,求解神经网络,明明就是求一下梯度,然后迭代一下,这多好理解,偏偏还弄个装逼的名字叫“反向传播”,...

阅读更多

Ubuntu深度学习环境搭建:安装Cuda、CuDNN、TensorFlow

前言 首先,确保你的机器上已经下载并安装好 Ubuntu 服务器系统 (Ubuntu Server) 了,如果是使用阿里云或者其他云服务主机,那么直接创建一个安装有 Ubuntu 的实例就可以了。 本文以目前最新的 Ubuntu Server 16.04.3 LTS 系统为例,介绍包括 CUDA、CudNN 软件以及 TensorFlow、Keras 等 Python 库的安装方法。 下面是我们需要安装的软件列表。 Cuda CudNN TensorFlow 确认 GPU 可用 首先我们需要检查 GPU 是否已正常安装并已处在运行状态。 lspci -nnk | grep -i nvidia 前期准备 在安装软件之前,首先确认 apt-get 已经更...

阅读更多

不可思议的 Word2Vec(下):用 Tensorflow 和 Keras 来实现 Word2Vec

汇总整理自《不可思议的Word2Vec》系列,作者苏剑林。部分内容有删改。 Tensorflow 版的 Word2Vec 不同的地方 本文的主要模型还是 CBOW 或者 Skip-Gram,但在 loss 设计上有所不同。本文还是使用了完整的 softmax 结构,而不是 huffmax softmax 或者负采样方案,但是在训练 softmax 时,使用了基于随机负采样的交叉熵作为 loss。这种 loss 与已有的 nce_loss 和 sampled_softmax_loss 都不一样,这里姑且命名为 random softmax loss。 另外,在 softmax 结构中,一般是 $\text{softmax}(Wx+b)$ 这样的形式,考虑到 $W$ 矩阵的形状事...

阅读更多

不可思议的 Word2Vec(中):提取关键词与词语相似度

汇总整理自《不可思议的Word2Vec》系列,作者苏剑林。部分内容有删改。 提取关键词 说到提取关键词,一般会想到 TF-IDF 和 TextRank,大家是否想过,Word2Vec 还可以用来提取关键词?而且,用 Word2Vec 提取关键词,已经初步含有了语义上的理解,而不仅仅是简单的统计了,而且还是无监督的! 什么是关键词? 诚然,TF-IDF 和 TextRank是两种提取关键词的很经典的算法,它们都有一定的合理性,但问题是,这两种算法虽然看上去简单,但并不容易想到。试想一下,没有学过信息相关理论的同学,估计怎么也难以理解为什么 IDF 要取一个对数?为什么不是其他函数?又有多少读者会破天荒地想到,用 PageRank 的思路,去判断一个词的重要性? 说到底,问题就...

阅读更多

不可思议的 Word2Vec(上):Word2Vec 的基本原理

汇总整理自《不可思议的Word2Vec》系列,作者苏剑林。部分内容有删改。 对于了解深度学习、自然语言处理 NLP 的读者来说,Word2Vec 可以说是家喻户晓的工具,尽管不是每一个人都用到了它,但应该大家都会听说过它——Google 出品的高效率的获取词向量的工具。 Word2Vec 的数学原理 Word2Vec 不可思议? 大多数人都是将 Word2Vec 作为获取词向量的工具,而关心模型本身的读者并不多。可能是因为模型过于简化了,所以大家觉得这样简化的模型肯定很不准确,但它的副产品词向量的质量反而还不错。没错,如果是作为语言模型来说,Word2Vec 实在是太粗糙了。但是抛开语言模型的思维约束,只看模型本身,我们就会发现,Word2Vec 的两个模型 —— CBOW ...

阅读更多

LSTM 网络原理:通过图解,一步一步“走过”LSTM

译自《Understanding LSTM Networks》,作者 colah。部分内容有删改。 循环神经网络 人类不是在每一个时刻重新开始思考的。当你阅读这篇文章时,你会根据你对以前的话语的理解来理解每个单词。你不可能把所有东西都扔掉,再从头开始思考。即你的思想具有持续性。 但是传统的神经网络就不能做到这一点,这似乎是一个很大的缺陷。例如,假设你想要判断一部电影中每个时间点发生的事件是什么类型。传统的神经网络是无法根据电影中前面出现的事件来推理后面出现的事件的。 循环神经网络解决了这个问题。它们是具有循环的网络,允许信息的持续存在。 在上图中,一组神经网络 $A$,输入一些 $x_t$,并且输出一个值 $h_t$。循环的结构允许信息从网络的一个步骤传递到下一个。 ...

阅读更多

在 Keras 模型中使用预训练的词向量

转载自《Using pre-trained word embeddings in a Keras model》,作者:Francois Chollet,部分内容有修改。 通过本教程,你可以掌握技能:使用预先训练的词向量和卷积神经网络解决一个文本分类问题。本文代码已上传到 Github。 什么是词向量? “词向量”(词嵌入)是将一类将词的语义映射到向量空间中去的自然语言处理技术。即将一个词用特定的向量来表示,向量之间的距离(例如,任意两个向量之间的 L2 范式距离或更常用的余弦距离)一定程度上表征了的词之间的语义关系。由这些向量形成的几何空间被称为一个嵌入空间。 例如,“椰子”和“北极熊”是语义上完全不同的词,所以它们的词向量在一个合理的嵌入空间的距离将会非常遥远。但“厨房”和...

阅读更多