Tags

ディープラーニングで講義のレポートを自動執筆


どうも初めまして、メンターのきよまるです。 僕は大学に入るまで、学校の課題というものをやったことがありませんでした。 高校時代には、あまりの課題提出率の低さから、家に電話がかかってきたこともありました。 しかし僕にとってそんなことは関係ありませんでした。 その課題に時間をかけてやるだけの価値が本当にあるのか。 それを決めるのは僕自身であるべきだと強く確信していたからです。 先生はいつも苛立ちと失望の混じり合った表情で問いかけます。 「どうして君は課題を出さないのか。」 その度に僕はこう返しました。 「言われたことしかできない奴は、この先の人生で何もできはしない。」 さあ、僕と一緒にサボりの向こう側の景色を見ませんか。

機械学習とは

機械学習の研究は人工知能の研究の一部として始まりました。 そこで最も重要なのは人間の知識や考え方をどのように表現し、どのように利用するかということです。 プログラミング言語にはif文やfor文がありますが、これは人間の考えを明示的に表現したものだと言えます。 しかしながら人の思考はややこしく、特に何かを認識したり運動を学習したりすることは、そのような形で明示的に表現することが非常に困難です。 そのような問題へのアプローチとして現在注目されているのが機械学習です。 脳はニューロンという神経細胞がシナプスという結合部位を通して他のニューロンとのネットワークを構築しているのですが、この働きに着想を得て、機械学習ではニューラルネットワークという情報処理メカニズムが用いられています。

レポートをさぼるためにやらなきゃいけないこと

さて、レポートをさぼるために必要なことは大きく分けて以下の2つです。

  • 今までのレポートを学習させる。
  • 学習によって得られたモデルから文章を生成する。

順番に見て行きましょう。

今までのレポートを学習させる。

日本語は英語のように単語をスペースで区切らないため、初めに学習の前処理として文章を形態素解析してやる必要があります。 今回は有名な日本語形態素解析システムであるMeCabを使ってやってみました。 元の文章がこちら。 「今回の演習実験の目的は、パターン認識についての基本的なアルゴリズムを学ぶことである。」 形態素解析したものがこちら。 「今回 の 演習 実験 の 目的 は 、 パターン 認識 について の 基本 的 な アルゴリズ ム を 学ぶ こと で ある 。」 ところどころあれな気もしますけどまぁいいんじゃないでしょうか。 こんな感じで僕のレポートをばらばらにしてやります。 とりあえず準備はオッケーでしょう。 さて、文章の学習にはLSTM(long short-term memory)法を用いたRNN(Recurrent Neural Network)を用いました。 RNNは、自身の出力をフィードバックさせるニューラルネットワークモデルで、時系列データを扱う際などによく用いられます。 このRNNには、誤差信号が隠れ層をたどっていく中で勾配が小さくなり、意図した大きさで伝わらなくなる勾配消失問題というものがあるのですが、LSTM法を導入することで長い時間差を持った共起関係を考慮した最適化が可能になります。 こんな感じでコーディングしました。

def forward_one_step(x_data, y_data, state, train=True):
    if args.gpu >= 0:
        x_data = cuda.to_gpu(x_data)
        y_data = cuda.to_gpu(y_data)
    x = chainer.Variable(x_data, volatile=not train)
    t = chainer.Variable(y_data, volatile=not train)
    h0 = model.embed(x)
    h1_in = model.l1_x(F.dropout(h0, train=train)) + model.l1_h(state['h1'])
    c1, h1 = F.lstm(state['c1'], h1_in)
    h2_in = model.l2_x(F.dropout(h1, train=train)) + model.l2_h(state['h2'])
    c2, h2 = F.lstm(state['c2'], h2_in)
    y = model.l3(F.dropout(h2, train=train))
    state = {'c1': c1, 'h1': h1, 'c2': c2, 'h2': h2}
    return state, F.softmax_cross_entropy(y, t)

学習によって得られたモデルから文章を生成する。

実はほとんど学習とやることは同じです。 ただ、一番確率の高いものを選ぶようなアルゴリズムにすると、同じワードの堂々巡りになることが予想されるため、確率分布に従ってランダムに選択するように実装すれば良いでしょう。 これできっとナイスなレポートを生成できるはずです。

レポートを書かせる

ついにこの時がやってきました。 僕の純朴なクローンが見事、レポートを書ききってくれることでしょう。 これが人類の新たな一歩です!

実行結果

おお…。 ひどい…。 なんてこった…。

おわりに

「私」という言葉の後に続く可能性のある語には、例えば「は」があったり、「が」があったりします。 このように、ある語の後に続く可能性のある語のバリエーション数を平均したものをパープレキシティと言い、しばしば自然言語処理ではモデルの確からしさを表す指標にされるのですが、今回のデータセットとプログラムから作成されたモデルはパープレキシティが300以上ありました。 先ほどの結果から、1度や2度しか出てこない単語が学習の妨げになっていることが推測されます。 この原因には、そもそもデータセットが様々なテーマの実験レポートのみであったことが考えられますが、今後そのような低頻度で出現する単語に対してどのような学習を行うかは検討していく必要があるでしょう。 いかがだったでしょうか。 僕の自動レポート執筆大作戦は、残念ながら成功とは言えない結果に終わりましたがまだ終わりではありません。 理工学部の学生として、楽をするための努力は生涯を通じて続けるべきです。 さあ、あなたも僕と一緒にシンギュラリティの向こう側へ挑戦してみませんか。