読者です 読者をやめる 読者になる 読者になる

try! Swift Swiftトレーニング: 統計学を例に #tryswiftconf Day3-6

try! Swift 2016

Diana Zmuda

thoughtbotに所属しているiOSエンジニアです。iOS on Railsと呼ばれるAPIと連携するモバイルアプリ開発に関する書籍を共同執筆しました。また、App Camp for Girlsのインストラクターもしています。ときおり、iOS関連のジョークを@dazmudaにてツイートしています。

twitter.com

Swiftの使いやすさとエレガントさはシンプルな数学の概念を探求しようとする数学愛好者にとって完璧なものです。この講演では、統計的なランキングデータと、特徴語の集合(BoW、Bag of Words)を新しいエレメントを分類するために使用し、マルコフ連鎖アルゴリズムを完全なデータポイントを生成するために使用します。講演の間に、さまざまな数式をSwiftだけで実装し、ソート、分類、データ生成にSwiftを利用するさまをお見せします。

f:id:niwatako:20160304142802j:plain

統計学の例をしたいと思います。

f:id:niwatako:20160304142844j:plain

マシンラーニングのコンセプトもご紹介します。Swiftの楽しい機能を使っていきたいと思います。

f:id:niwatako:20160304142912j:plain

ランキングシステムを計算する。分類器をつかう。ナイーブサマライズアルゴリズムでテキストパラグラフをサマリーし、関連する部分を抜き出す。マルコフ連鎖によるテキスト生成器を作る。アニメのタイトルやレーティングを用いる。様々なアニメがレーティングにもとづいて見られるものを最後にお見せします。

f:id:niwatako:20160304142959j:plain

f:id:niwatako:20160304143038j:plain

f:id:niwatako:20160304143045j:plain

f:id:niwatako:20160304143051j:plain

Rating

レーティングの計算の話をしましょう。友人が推薦しているものをいつも見ますが、インターネットの時代ですから、どのようにランキングを自動化出来るか見てみます。

ランクでアイテムをソートし、アニメタイトル、プラス評価マイナス評価の中で、点数が正しいのか?観察されたスコアと実際のスコアが実際に同じかわかりません。誰もが見て同じレーティングをするか、違うボタンを押す可能性もあります。投票数が大きいほど信頼度が高くなります。

f:id:niwatako:20160304143227j:plain

信頼区間の下限(加減?)を見ていきます。

f:id:niwatako:20160304143305j:plain

すべてのエレメントは比較可能なプロトコルに準拠している。

f:id:niwatako:20160304143337j:plain

信頼区間は上限と下限のタプルを返しています。いい加減で良ければ上限を使っても良いでしょう。今回は下限だけ使います

zにもとづいてプラスの投票、トータル投票が出ます。特別なキャラクタ(特殊文字)を使えるのは非常に役に立ちます。

こちらが信頼区間

f:id:niwatako:20160304143454j:plain

リストをランキングに基づいてランキングしていきます

Tokenizing

f:id:niwatako:20160304143512j:plain

テキストのトークン化が必要です。巨大ロボットのジャンルだけ見たいとします。

まずは分類ですが、記述を表すもの、ジャンルのAのアニメ、Bとの相関関係というのが入ってきます。

f:id:niwatako:20160304143559j:plain

各トレーニングセットは分断した集合になっています。

f:id:niwatako:20160304143635j:plain f:id:niwatako:20160304143715j:plain

ハイパーローカルな単一でのみ意味を成す関数になっています。

f:id:niwatako:20160304143744j:plain

これは各データの分類だけを抜き出したものです。学習セットの分類は教師データなので分類はわかっています。

Classifying

トークン化された表現を見ていくことが出来、分類されたテキストが出てきます。アニメディスクリプションは魔法少女、あるいは巨大ロボットとして定義され、ベルヌーイトライアルではこうした2つが出てくる

f:id:niwatako:20160304143907j:plain

f:id:niwatako:20160304143932j:plain

値は確立、各分類における言葉の確立です。ロボットはジャイアントロボットの66%に登場する。そして、魔法少女の場合は全く別の確立が出てくる。

このような確立を計算しループに格納する

学習データセットの分類ができました。

f:id:niwatako:20160304144024j:plain

概念化します。typealiasを作ります。ほぼほぼなんでも分類できる柔軟性が得られます。

f:id:niwatako:20160304144059j:plain

Classyfiの中には結果のタプルを作り、結果とスコアが入ります。for loop を巨大ロボットに対してやってみます。

100%から始まって、すべてのアニメの80%が既に巨大ロボットであれば80%を使ってもいいでしょう。

言葉が入っているかどうかテキストのチェクをし、入っているのであればトークンの言葉の可能性で掛けていきます、そうでなければその逆で掛けます。その言葉は巨大ロボットのアニメのディスクリプションには入らないだろう確率です。

最後に最も可能性が高い者を返します。

Summarizing

f:id:niwatako:20160304144255j:plain

アニメのディスクリプションについてまとめていきましょう。 「あきら」を見たことがある人。クレイジーな映画ですね。クラシックで絶対見なくてはいけない作品と言われましたがみて混乱しました。そこでサマリーを作ります。

要は機械学習です。

シンプルな実装を作り、テキストをまとめるためには我々のすべての文章に対する代表サブセットを作る必要がある。

文章セット全体の文章、代表サブセットを作る。それを見極めるにはテキスト中の他のセンテンスと比較し、他と類似性が高ければ代表性が高いと評価する。また共通の言葉を持つ相似性も比較します。相似性が高ければサマリの中にその言葉が入る可能性も高いと考えられる。

f:id:niwatako:20160304144450j:plain

これがパラグラフに分けられた文字列を返していきます。 これらすべてがStringArrayを返してくれます。

f:id:niwatako:20160304144526j:plain

すべてのセンテンスに対してストリングのスコアを返します。各他の文章との公差の和?になります

文章全てにループした後に代表スコアを含む辞書を返す。

ここで実際に人々の書き方を考えます。(デリミターがセンテンスの終了として信頼できる?)

f:id:niwatako:20160304144701j:plain

それぞれのパラグラフの最高スコアセンテンスのみを抽出し最終的にそれらを加えればサマリーが出来る。

f:id:niwatako:20160304144728j:plain

アキラに適用してみた、6段落で各段落から1センテンス抽出されたものです。

いろんな人が肉体の爆発するところですが少しはトラウマにならずに済む。

Generating

f:id:niwatako:20160304144908j:plain

マルコフ連鎖

ステート移行の確率、これは現在のステートに依存します。前のステートには依存しません。

ツイートすると自分の言葉のように返してくれるものがありますがそのようなもの。

f:id:niwatako:20160304144914j:plain

次のステートは次に来うる言葉のすべてがその可能性。

f:id:niwatako:20160304144933j:plain

seedを定義し、これが最初と最後のステートを定義します。文字が入っているはずでしたがレンダリングされませんでした。。

f:id:niwatako:20160304145015j:plain

これはどのように言葉がメモリモデルに追加され学習されるかを表します。

f:id:niwatako:20160304145048j:plain

このモデルを使って言葉の羅列を作りましょう。ランダムな確率で次の言葉が選択されます。

f:id:niwatako:20160304145111j:plain

現在のステートを元に次のランダムステートを選択し、シードが出るまで再帰をかけていきます。

まとめ

f:id:niwatako:20160304145140j:plain

評価分類ジェネレーションサマリー、こうしたミニフレームワークを使うことで、例えば評価や自動分類やまとめ、新しいタイトルの生成を行うアプリケーションを作ることが可能になりました。

特に日本語のトークン化に関してですが、漢字以外のすべてを取り出すことが出来れば文章やテキストのトークン化には完璧です。

そのままでルート化されているのでトークン化には適していると思います。

Summary

Swiftは新しいコンセプトを学ぶのにも優れたツール。理論も一緒にテストできました。楽しい事例を混ぜて学ぶことが出来ました。

他にも私が喋っている言葉、みなさんにとっては外国語ですが、我々の中でこれまでの事例については良いディスカッションが出来ます。

機械学習がシンプルに効率的に出来て統計コンセプトもあるんです。

我々が使っている言語は非常にエレガントです。

パイソンも素晴らしく、可能だと思いますが、もうちょっと時間がかかったと思います。

ここまでお話した実装、Swiftの中には沢山の??があります。どんなオブジェクトでも分類したり、Genericオブジェクトを作ったり。統計的モデリングをするにはこうした機能は非常に重要です。

信仰言語ですが我々は情熱を持っています。

日常業務と少し離れた楽しいことも出来ることを示せたと思います。

バックエンドを構築するにあたって選ばれる言語になる日が来るでしょう。自然言語処理言語としてパイソンだけの日々が続くとは思いません。バックエンド不可が高い処理にSwiftが選ばれる日が来ると思っております。

f:id:niwatako:20160304145548j:plain f:id:niwatako:20160304145554j:plain

QA

驚いたのはどれほどこのプロセスがStringを活用しているかということです。インメモリオブジェクトを沢山作っています。メモリ消費はどのようでしょうか?インパクト最小化戦略はありますか?

それほど驚くほどのデータセットは今回使っていません。オーバーヘッドは大したことなかったです。Playgroundで済みました。いろいろやってみてください。最も効率のよい方法を探すことだと思います。これは学習のツールですので、ディープダイブをしたければ是非探求して下さい。

気に入った記事は はてなブックマーク

はてなブックマークアプリiOS開発チームから来ました! はてなブックマークにはSwift特集があります! 良い記事を見逃さないように、ご利用ください! http://b.hatena.ne.jp/hotentry/it/Swift

そして良いまとめ記事があったらはてなブックマークでブックマークしましょう! try! Swift の記事で盛り上がると嬉しいです!