fz-qqq's diary

テキストマイニング、機械学習など

Deep Learningを勉強する際に参考にしたサイト・書籍まとめ

随時更新していきます。

そもそもロジスティック回帰とは?MLPとは?

多層パーセプトロンMLP)を理解する

ニューロンが学習する様子をコマ送りに見ることができます。

誤差逆伝播法について説明してくれています。

  • 層が増えることで表現力が増すことは下記書籍の4章で理解しました。

集合知プログラミング

集合知プログラミング

Deep Learning全般について

Learning Deep Architectures for AI

1つ目の資料ではDeep Learning全般のアルゴリズムについて解説してくれています。ただ、英語でものすごく長いので、二つ目のまとめ資料を参考にしながら読むと読みやすいです。

各種勉強会・学会資料など


Stream videos at Ustream
Ustream.tv: ユーザー preferred: Deep Learningの技術と未来, PFI Show . コンピュータ

NNの基本から、Deep Learning、NLPへの応用まで、幅広く取り扱ってくれている動画。英語ですが、とても参考になります。

生成モデル、RBM、畳み込み、Autoencoderなどが理解しやすいです。

東大での勉強会資料。全般的に役に立ちます。

Deep Learning × NLP

Manning先生による、NAACL HLT 2013でのチュートリアル資料です。動画も上記サイト中にあります。

自然言語処理でどのように特徴量を作ればよいか。また、どういった関連研究があるのかなどがまとめられています。

ハイパーパラメータに関してなど、実用における注意点をまとめてくれています。

実装について

theanoを利用しない実装

theanoを利用せずに実装しているコードを見ることで、中身の理解が進みました。

Pylearn2での実装

githubのページ

deeplearning.netでの紹介

XORの分類はここを参考にさせてもらいました。

Pylearn2の実装について紹介してくれています。

Pylearn2を使ったDeep Learningの実装(多層パーセプトロン編)


以前の記事でも取り上げましたが、Deep Learningは今年に入ってさらに話題となっています。
実装する場合にまず参考となるのが公式の公式のチュートリアルページです。
このページに書かれている内容については一度理解する必要があるのですが、このページでも利用されているtheanoというライブラリは、勾配を求める部分など、Deep Learningを実装する際の関数集のようなものになっており、このページを参考に自分のデータへ適用させると、変更点が多いためコードが長くなってしまいます。
そこで、今回の記事からは、Deep Learningの代表的なアルゴリズムが実装されたライブラリである、Pylearn2の利用の仕方についてまとめたいと思います。

今回はその準備として、多層パーセプトロン(Multi Layer Perceptron)で、XORの分類を行うコードを紹介したいと思います。
コードはこちらのgithubリポジトリにもありますが、以下のようになっています。

【XOR.py】

# coding: utf-8
import sys, theano
sys.path.append('/home/fujikawa/lib/python/other/pylearn2/pylearn2')
from pylearn2.datasets.dense_design_matrix import DenseDesignMatrix
import numpy as np
from random import randint

class XOR(DenseDesignMatrix):
    def __init__(self):
        self.class_names = ['0', '1']
        X = [[randint(0, 1), randint(0, 1)] for _ in range(1000)]
        y = []
        for a, b in X:
            if a + b == 1:
                y.append([0, 1])
            else:
                y.append([1, 0])
        X = np.array(X)
        y = np.array(y)
        super(XOR, self).__init__(X=X, y=y)
    def test(self, model):
        print '#######    TEST    #######'
        print 'Input: [0, 0] -> Predict: ' + str(model.fprop(theano.shared(np.array([[0, 0]]), name='inputs')).eval()) + ' (Correct: [1, 0])'
        print 'Input: [0, 1] -> Predict: ' + str(model.fprop(theano.shared(np.array([[0, 1]]), name='inputs')).eval()) + ' (Correct: [0, 1])'
        print 'Input: [1, 0] -> Predict: ' + str(model.fprop(theano.shared(np.array([[1, 0]]), name='inputs')).eval()) + ' (Correct: [0, 1])'
        print 'Input: [1, 1] -> Predict: ' + str(model.fprop(theano.shared(np.array([[1, 1]]), name='inputs')).eval()) + ' (Correct: [1, 0])'
        

MLP.py】

# coding: utf-8
import theano, sys
sys.path.append('/home/fujikawa/lib/python/other/pylearn2/pylearn2')
from pylearn2.models import mlp
from pylearn2.training_algorithms import sgd
from pylearn2.termination_criteria import EpochCounter
from pylearn2.train import Train
import numpy as np
from XOR import XOR

###############################
####  Setting for dataset  ####
###############################
dataset = XOR()

##########################
####  Setting for NN  ####
##########################
# create layers
hidden_layer = mlp.Sigmoid(layer_name='hidden', dim=3, irange=.1, init_bias=1.)
output_layer = mlp.Softmax(2, 'output', irange=.1)
layers = [hidden_layer, output_layer]
model = mlp.MLP(layers, nvis=2)

####################
####  Training  ####
####################
train = Train(
        dataset,
        model,
        algorithm=sgd.SGD(learning_rate=.05, batch_size=10, termination_criterion=EpochCounter(400))
)
train.main_loop()

#################
###  Testing  ###
#################
dataset.test(model)

上記のように、少ないコード量で実装ができ、内部的にはtheanoが利用されているので、環境を整えればGPUの利用等も可能であるのがこのライブラリの大きな利点です。
ただ、日本語はおろか、英語のドキュメントも少ないため、こちらの実装の中身を見て理解する必要があります。

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

Linux (Cent OS) でサーバ構築する際に毎回やることまとめ

1. 初期設定

  1. yum update
  2. 日本語対応
    • vim /etc/sysconfig/i18n
      • LANG="C" -> LANG="ja_JP.UTF-8"
  3. useradd -m username, passwd username
  4. sudoの有効化
    • usermod -G wheel username
    • visudo
      • %wheel ALL=(ALL) ALL # コメントイン
  5. dotファイルのコピー(.ssh/.vim/.vimrc/.zsh/.zshrc。ただし.ssh内はauthorized_keys、id_rsa.pubのみ)
  6. zshへ変更
    • chsh -s /bin/zsh (zshが無かった場合はyum install zsh)
    • 有効になってるか確かめるため一度sshのログインをし直す
  7. sshの設定(ポート番号変更、パスワードログイン禁止、ルートログイン禁止)
    • vim /etc/ssh/sshd_config
      • Port YOUR_PORT_NUMBER # コメントインして好きなポート番号に変更
      • PasswordAuthentication no # yesからnoに変更
      • PermitRootLogin no # yesからnoに変更
    • service sshd restart # 以後はsshログイン時に -p YOUR_PORT_NUMBER をつけるようにする
  8. ファイアウォールiptables)の設定
    • vim /etc/sysconfig/iptables
      • -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT の下に
        -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT を追加
    • service iptables restart
    • iptables -L

2. Webサーバ(Apache)の設定

  1. httpdのインストール・設定
    • yum install httpd
    • chkconfig httpd on # httpd自動起動設定
    • vim /etc/httpd/conf/httpd.conf
      • ServerName の設定をコメントイン
      • ServerTokens OS -> ServerTokens Prod
      • ServerSignature On -> ServerSignature Off
      • の下の Options Indexes FollowSymLinks -> Options -Indexes FollowSymLinks
    • service httpd configtest
    • service httpd start
  2. IP.ADD.RE.SSへブラウザでアクセスしてApacheのページが出るか確認
  3. chown -R username:username /var/www/html
  4. VirtualHostの設定
<VirtualHost *:80>
  ServerName dev.example.com
  DocumentRoot "/var/www/dev.example.com/public_html"
  DirectoryIndex index.html index.php
  ErrorLog /var/log/httpd/dev.example.com_error_log
  CustomLog /var/log/httpd/dev.example.com_access_log combined
  AddDefaultCharset UTF-8
  <Directory "/var/www/dev.example.com/public_html">
    AllowOverride All
  </Directory>
</VirtualHost>
    • vim /etc/httpd/conf/httpd.conf # Virtual Hostの有効化
      • NameVirtualHost *:80 # コメントイン
    • service httpd configtest
    • service httpd restart

3. よく利用するパッケージ・アプリケーションのインストール

  1. tmux(/usr/local/srcなどに入れる)
  2. dropbox(各ユーザのホームディレクトリに入れる)
  3. gcc 4.8.2(gccの最新版のソースからのインストール)
  4. sshfs

4. PHPの設定

  1. 必要なパッケージのインストール
  2. /etc/php.iniの編集
    • error_log = /var/log/php.log # コメントインして保存場所も変更
    • expose_php = Off # コメントイン
    • date.timezone = Asia/Tokyo # コメントインしてAsia/Tokyoを追記
    • マルチバイトの設定
      • mbstring.language = Japanese # コメントイン
      • mbstring.internal_encoding = UTF-8 # コメントインしてUTF-8へ変更
      • mbstring.http_input = auto # コメントイン
      • mbstring.detect_order = auto # コメントイン
  3. service httpd restart

5. MySQLの設定

  1. yum install mysql-server
  2. MySQLのディレクトリの変更(/home/mysqlへ変更する手順)
    • /etc/init.d/mysqld status でMySQLが止まってることを確認
    • 新しいデータディレクトリの作成
    • デフォルトデータベースの作成
  3. /etc/my.cnfの設定
    • 以下の部分を下記のように変更する
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
[mysqld]
datadir=/home/mysql
socket=/home/mysql/mysql.sock

[client]
socket=/home/mysql/mysql.sock
  • [mysqld_safe]の直前に以下をコピペ
character_set_server=utf8
default-storage-engine=InnoDB
innodb_file_per_table
[mysql]
default-character-set=utf8
[mysqldump]
default-character-set=utf8
  • service mysqld start
  • MySQL上で確認
    • SHOW VARIABLES LIKE 'datadir';
    • SHOW VARIABLES LIKE 'socket';
  • chkconfig mysqld on

6. Pythonの環境構築

  1. Python2.7のDL、インストール
  2. distributeのDL、インストール
  3. pipのインストール
    • easy_install-2.7 pip

7. Perlの環境構築

  1. Perlbrewのインストール・Perlの利用するバージョンへの変更
    • curl -L http://install.perlbrew.pl | bash
    • 以下を.zshrcへ追記
      • export PERLBREW_ROOT=$HOME/perl5/perlbrew
      • export PERL5LIB=$HOME/perl5/lib/perl
      • source ~/perl5/perlbrew/etc/bashrc
    • perlbrew available
    • perlbrew install 5.18.2
    • perlbrew switch perl-5.18.2
  2. cpanm のインストール・各種ライブラリのインストール
    • cpan App::cpanminus
    • cpanm Amon2 Carton Teng Reply

図解でわかる Linuxサーバ構築・設定のすべて

図解でわかる Linuxサーバ構築・設定のすべて



Hadoop Streaming で手軽に Map Reduce する

研究で Hadoop Streaming を利用して負荷分散をしていますが、それなりに躓いた点もあったので、備忘録がてら簡単にまとめておきたいと思います。ちなみに、Map Reduce って何?って人はYahoo! Japan のブログ http://techblog.yahoo.co.jp/architecture/hadoop/Hadoop Streamingって何?って人は、こちらの方のブログ http://blog.liris.org/2009/05/hadooppythonno.html がとてもわかりやすくまとめてくれています。

なぜPythonでもRubyでも動くのか

Hadoop Streamingを使えば、PythonRubyなど、自分の好きな言語でMap Reduceのプログラムを書くことができます。内部ではJavaで実装されたMapper・Reducerが、UNIXコマンド "./mapper.py" を実行し、その結果をMapper・Reducerの出力として扱ってくれているためです。そのため、一行目には必ず "#!/usr/bin/python" といった、実行コマンドのフルパスを記述しておいてあげなければちゃんと動いてくれません。

Hadoop Streaming実行の主なコマンドオプション

オプション 説明
-mapper path/to/mapper mapperの絶対パス
-reducer path/to/reducer reducerの絶対パス
-combiner path/to/combiner combinerの絶対パス
-file path/to/file mapper、reducer、combinerの絶対パスと、各プログラム中で呼び出す必要のある外部ファイルの絶対パス
-D mapred.job.name="jobname" ブラウザ上で表示する際のJobの名前
-D mapred.map.tasks=30 mapperのタスク数の指定
-D mapred.reduce.tasks=30 reducerのタスク数の指定
-D mapred.job.priority=HIGH jobのpriorityの設定

よく利用するHadoopコマンド

コマンド 説明
hadoop fs -put ローカルファイル名 HDFS上でのファイル名 HDFS上にファイルをアップロード
hadoop fs -ls HDFS上のファイルを確認
hadoop fs -rmr HDFS上のファイルを削除
hadoop fs -get HDFS上のファイルをダウンロード
hadoop fs -cat HDFS上のファイルをcat

とりあえず実行してみる

とりあえず動いているところを試したければ、こちらに辞書中の単語に関してword countを行うプログラムを掲載しているので、git cloneしてHadoopの動く環境のあるサーバへ置いて下さい。下に同じプログラムを掲載しています。
HDFS上で実行する前に、プログラムが正しいかどうか確認する際は、以下のコマンドで確認できます。

cat sample.txt | ./mapper.py | ./reducer.py

小さいファイルで動くことを試せたら、自分のファイルをHDFS上へ上げてみましょう。
hadoop fs -put (ローカルのファイル名) (HDFS上でのファイル名)
実行のシェルスクリプトを自分の環境用に変更しましょう。変更点は以下の三点です。

hadoop_in=" ** path-to-hdfs-file ** "
hadoop_out=" ** path-to-hdfs-file ** "
options=$options" -file ** path-to-dic.json **"

ちなみに path-to-dic.jsonはローカル上の絶対パスなので、例えば/home/username/wordcount_streaming/dic.jsonなどになります。
辞書データなどを使わない場合はこの項目を消して下さい。
あとはsh run.shで実行すればプログラムが動作するはずです。
プログラムが終了したら、以下のコマンドで実行結果を確認しましょう。

hadoop fs -cat (hadoop_outのファイル名)/p* | less


Hadoop Streaming を利用した word count

Hadoop 第3版

Hadoop 第3版

Deep Learning ライブラリ「word2vec」で関連のある単語を予測するシステムを作った

f:id:kaz_uki_1014:20130903052128p:plain

Deep Learningとは

Deep Learningは、ICML・ACLといった機械学習関連の主要な学会のチュートリアルでも紹介され、近年注目を集めています。Deep Learningといえば、Googleによる猫の識別を始めとした画像認識で特に有名ですが、今年に入ってもその勢いは増すばかりで、

GoogleがDeep Learningの第一人者Hinton先生を生徒ごと買収したりDeep Learning主体の学会ができたりと、多くの話題を作っています。詳しい動向・中身に関しては以下のページでよくまとめられています。

ニューラルネットの逆襲 | Preferred Research

データマイニングコンペティションサイト Kaggle にも Deep Learning ブームがきてるかと思ったのでまとめる - 糞ネット弁慶

DEEP LEARNERについて

簡単に扱えるライブラリとしてTheanoなどが有名ですが、今回、GoogleによってNLP自然言語処理)に特化したツール「word2vec」が公開(Google Open Source Blog: Learning the meaning behind words)されたので、可視化するツールDEEP LEARNER」を作成しました。また、日本語版Wikipediaの全記事をmecab形態素解析して作成した日本語のコーパスを用いることにより、日本語によるデモも可能にしました。

このツールでは、例えば「中村俊輔」といった単語に近い単語を拾ってきたり(「中田英寿」「中山雅史」「香川真司」など)、「フランス パリ→日本 ?」という問いに対して「東京」という答えを出すことができます。形態素解析のミスが少しありますが、今後mecabにユーザー辞書を追加することで解決しようと思っています。

中では何をやっているのか

文章を単語レベルに区切ったもの(英語はそのまま、日本語は単語ごとに半角スペースを加えたもの)をコーパスとして用い、ある程度の頻度で現れる各単語に対して特徴ベクトルを作成します。その特徴ベクトル間の距離を計算することで、単語間の意味的な関係をうまく近似している、といったものになっています。

  

人工知能は人間を超えるか (角川EPUB選書)