今日も窓辺でプログラム

外資系企業勤めのエンジニアが勉強した内容をまとめておくブログ

TensorFlowでword2vecを使って単語ベクトルを学習する

今回やること

前回の記事で、RNNを使って文字レベルの言語モデルを実装しました。
シンプルなRNNで文字レベルの言語モデルをTensorFlowで実装してみる - 今日も窓辺でプログラム

英語を対象にしたので入出力の次元は26文字+スペースの27次元で済んだのですが、単語レベルの言語モデルを実装しようとすると次元は非常大きなものになってしまいます。
それを解決するのが皆さんご存知word2vecで、TensorFlowではword2vecが簡単に利用できるような機能が提供されているようなので、今回はそれを試してみたいと思います。

実装には、以下のコードを大いに参考にしています。
tensorflow/word2vec_basic.py at master · tensorflow/tensorflow · GitHub

続きを読む

Pythonでunzipってどうやるの?

Pythonのリストを結合するzip関数の逆の挙動を実現する方法について、今日初めて知ったので記事として残しておきます。

そもそもzip関数とは

zip関数は次の例のように、複数のイテラブル(下の例の場合はリスト)のi番目の要素をまとめた新しいイテレータを作る関数です。

name = ("Sato", "Tanaka", "Yamada")
score = (70, 80, 90)

# リストを作ったり
print(list(zip(name, score))) # [('Sato', 70), ('Tanaka', 80), ('Yamada', 90)]

# ループを回したり
for n, s in zip(name, score):
    print(n, s)
# Sato 70
# Tanaka 80
# Yamada 90

これと逆のこと、つまり

pair = [('Sato', 70), ('Tanaka', 80), ('Yamada', 90)]

というリストが与えられたときに、

name, score = unzip(pair)

といって名前とスコアのリストをそれぞれ得る、というような操作がしたいことがあるのですが、Pythonにunzipという関数は定義されていないようです。

unzipの実現方法

結論から言うと、次のコードでunzipが実現できます。

pair = [('Sato', 70), ('Tanaka', 80), ('Yamada', 90)]
name, score = zip(*pair)
print(name) # ('Sato', 'Tanaka', 'Yamada')
print(score) # (70, 80, 90)

なぜそうなるのか?

注目すべきは zip(*pair)の部分です。zipの引数の前にアスタリスクがついています。
関数呼び出しの引数の前についているアスタリスクは、公式ドキュメントにもあるように展開されて解釈されます。
つまり、先ほどの例だと

pair = [('Sato', 70), ('Tanaka', 80), ('Yamada', 90)]
zip(*pair)

この2行目の引数の部分が展開されて、次のように処理されることになります。

zip(('Sato', 70), ('Tanaka', 80), ('Yamada', 90))

zipの引数それぞれの2番目の要素(名前)、2番目の要素(スコア)がまとめられるので、確かにunzipに相当する動きをすることが確認できます。


参考サイト:
pythonでzip、unzip - Qiita
アスタリスクによるシーケンスの展開 - or1ko's diary

シンプルなRNNで文字レベルの言語モデルをTensorFlowで実装してみる

はじめに

GoogleやMicrosoftなどがディープラーニングを使用した機械翻訳をリリースして各所で話題になっています。こんな感じで記事にもなっています。

せっかくなのでこれらのニュースと少し関連のある、RNNを使用した言語モデルをTensorFlowで実装してみたいと思います。
まずはその第一弾として、文字レベルでの英語の言語モデルを実装します。また、学習の過程をTensorBoardを使用して可視化もしています。
今回はとりあえずRNNを組むことを目標とし、ハイパーパラメータの調整など精度を追求するための作業は行いません。

RNNを組むのは初めてで実装があっているか不安なので、もし間違っているところがあったらご指摘いただけると幸いです。

続きを読む

「ゼロから作るDeep Learning」を読んで知ったことのメモ

ディープラーニングの知識があまりない私が「ゼロから作るDeep Learning」を読んで知ったことを、自分用のメモも兼ねてまとめておきます。
本では実際のコードを使ってディープラーニングの基礎を解説していますが、今回の記事はメモなのでコードは出さずに断片的にメモしておきたいことを残しておきます。。
詳細が気になる方は、本やこの本のGitHubレポジトリを参考にしてください。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

続きを読む