CS229 学习笔记 Part3

SVM

CS229 对于 SVM 的理论解释是我学习到的最详细也是最好的一份资料了,对比对象有周志华《机器学习》、《机器学习实战》、Coursera 上的 Machine Learning 等。相当推荐学习 CS229。

分类间隔 (Margin) 和 SVM 的优化目标『最大化分类间隔』这里就不多说了,很好理解,主要还是记录 CS229 中学到的新内容。一个数据点离分类边界 (decision boundary) 越远,则确信度越高。我们的优化目标也相当于寻找一个远离所有数据点的分类边界,当然,前提是这个分类边界得到的分类都正确。

SVM 的一些特殊定义也提及一下,

  • \(y\) 的取值不是 \(\{0,1\}\) 而是 \(\{-1,1\}\)。
  • 假设函数 \(h_{w,b}(x) = g(w^Tx+b)\) 中,我们把截距项单独写出来,便与后续的计算。
  • 我们的分类器输出结果会直接是 1 或 -1,不像 Logistic 回归那样先输出 \(y\) 是某一类的概率。
Read more   2017/6/7 14:35 下午 posted in  Machine Learning

CS229 学习笔记 Part2

判别式和生成式

对于一个分类任务,判别式和生成式分别代表了两种不同的思路:

判别式

通过直接从输入数据中学习,得到一个『特定输入对应的实际类别』的概率模型,模型的参数为 \(\theta\) 。即学习建模 \(p(y\mid x)\)

生成式

通过对每一个类进行建模,然后就可以通过条件概率算出输入的数据更可能由哪一类生成。即学习建模 \(p(x\mid y)\) 和 \(p(y)\) ,然后计算 \[\arg\max\limits_y\frac{p(x \mid y)p(y)}{p(x)}\]

并且实际计算中,分母 \(p(x)\) 并不会影响各个类别概率的排序,所以最终简化成 \[\arg\max\limits_y p(x \mid y)p(y)\]

Read more   2017/6/5 1:14 上午 posted in  Machine Learning

CS229 学习笔记 Part 1

此笔记为我的 CS229 的学习笔记之一,由 Andrew Ng 的 CS229 Lecture notes 和 课堂录像整理而来。用于记录所学到的内容。记录顺序重新编排过,并非是课程原本的教学顺序,并且省略了课程中的一些推导过程,所以适合学习后整理备忘使用,不适合用于同步辅助学习。

广义线性模型 GLM (Generalized Linear Models)

广义线性模型是所学到的 Linear Regression 以及 Logistic Regression 的推广形式(更准确的说,这两种模型都属于 GLM 的特殊情况)。它有三个关键假设(Assumptions)构成:

  1. \(y \mid x;\theta\sim ExponentialFamily(\eta)\) :对于固定的参数 \(\theta\) 以及给定 \(x\), \(y\) 的分布服从某一指数分布族(如高斯分布、伯努利分布、Softmax分布)
  2. 对于给定的 \(x\) ,目标是预测 \(T(y)\) 的值。换一种说法就是,我们定义假设函数 \(h(x) = E[y\mid x]\)
  3. natural parameter \(\eta\) 和 输入 \(x\) 是线性相关的, \(\eta = \theta^ \mathrm{ T } x\) (其中,当输入 \(x\) 和 \(\eta\) 是向量的时候, \(\eta_i = \theta_i^ \mathrm{T}x\))
Read more   2017/5/12 23:14 下午 posted in  Machine Learning

原始模型优化笔记

对于原始弹幕分类CNN模型进行优化。

修改 word2vec model 的 vector size

  • 400: Nice at epoch 38, validation acc 96.56%
  • 200: Nice at epoch 37, validation acc 95.22%
  • 100: Nice at epoch 34, validation acc 94.78% 单轮训练时间与50维相近,测试样例测试耗时 0.92secs
  • 50: Nice at epoch 40, validation acc 94.39% 单轮训练时间在7秒左右,测试样例(av 8365806)测试耗时 0.7secs

尝试加入dropout

在两个 conv 层之间和两个 fc 层之间各加入了一个 \(p=0.5\) 的 dropout

40 epoch 时只有 89.1 acc, 和预想的一样,会导致 达到最佳效果的 epoch 数上升。

用了 dropout 后一个很明显的变化是,原本训练过程中通常是train acc 高于 validation acc,现在通常是 validation acc 高于 train acc,训练后期才基本持平或反超

vector在 epoch 90 左右 达到了96.50%上下的 acc,最终在epoch 300 以上能达到 97.10% 左右的 acc

屏幕快照 2017-02-24 22.15.27

Read more   2017/3/1 17:4 下午 posted in  Deep Learning

低素质弹幕分类器的CNN实现

整体架构

对于一条弹幕,首先进行分词,然后通过 word2vec 转换为词向量,再填充至固定长度,作为卷积神经网络的输入。

卷积神经网络的结构如下:

model = Sequential()
model.add(Convolution1D(100, 4, border_mode='valid', input_shape=(100, word_model.vector_size)))
model.add(Activation('relu'))
model.add(Convolution1D(100, 4, border_mode='valid', input_shape=(100, word_model.vector_size)))
model.add(Activation('relu'))
model.add(Flatten()) 
model.add(Dense(100, activation='relu'))
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy']
             )

最终输出为2位的 categorical result,直接使用第一项,即骂人弹幕的概率作为输出。

然后通过代理,在弹幕服务器与播放器之间插入一层,实现弹幕的分类与屏蔽。最终实现了有效的骂人弹幕自动屏蔽,但是误伤的情况依然存在。

搭建过程

Read more   2017/2/6 14:48 下午 posted in  Deep Learning

低素质弹幕分类器 CNN 训练笔记

一开始使用这个结构,迭代10次。

model = Sequential()
model.add(Convolution1D(100, 4, border_mode='valid', input_shape=(100, word_model.vector_size)))
model.add(Activation('relu'))
model.add(Convolution1D(5, 4, border_mode='valid'))
model.add(Activation('relu'))
model.add(Flatten()) 
model.add(Dense(32, activation='relu'))
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy']
             )

完成训练后,乍一看准确率很高,结果 print 出来看一下,低素质弹幕完全没有被过滤,完全是将分类全部丢给 positive 达到的高准确率 (0.98) 的确是 meaningless classification
并且这个结果在loss里看得很清楚,loss一直是处于15+的

Read more   2017/2/6 14:48 下午 posted in  Deep Learning

在 Linode 上编译 hybla 模块

考试复习期间,不想复习,搞搞其他东西散散心,发现shadowsocks 有关于 TCP Fast Open 的更新,看说明的过程还发现了官方的速度优化指南,尝试优化自己的 ss 速度,然而报错。

执行到这一步时运行出错

sysctl --system
...
sysctl: setting key "net.ipv4.tcp_congestion_control": No such file or directory
net.ipv4.tcp_congestion_control = hybla
* Applying /etc/sysctl.conf ...
Read more   2016/12/27 23:22 下午 posted in  OS

无需手动缓存长度

今天在阅读《机器学习实战》的时候,看到了这样一句描述

IMG_0629

其中数据集是一个List。看到这里说到为了提高代码效率,特地开了一个变量来保存其长度。

Read more   2016/7/27 17:13 下午 posted in  Python

使用 Python 装饰器来将普通函数加入任务队列

对于操作『函数对象』来说,使用 Python 装饰器是一种非常优雅,非常 Pythonic 的一个方式。而在这篇文章中,对于任何一个普通的函数,只需要在函数定义前加一个装饰器调用,即可使得这一函数被调用时自动加入特定的任务队列,成为异步调用,而不会阻塞主线程。

Read more   2016/7/14 23:41 下午 posted in  Python

关于Python的logging模块初始化无效的一个小坑

众所周知,logging模块是一个非常方便好用的日志输出模块。但是最近的使用发现了一个小坑,记录一下,避免再次踩坑。

一般使用logging模块都会对其进行初始化,使用以下代码:

    log_format = '[%(levelname)s] %(asctime)s  %(filename)s line %(lineno)d: %(message)s'
    date_fmt = '%a, %d %b %Y %H:%M:%S'
    logging.basicConfig(
        format=log_format,
        datefmt=date_fmt,
        level=log_level,
    )
Read more   2016/4/19 23:45 下午 posted in  Python