仕事用にTransformer/BERTの情報をまとめる


最近、『Transformerによる自然言語処理』という書籍を買って、これまであまり追いかけていなかったTransformerについて仕事でカジュアルに使えるレベルまで色々と準備してみようと思い、その過程で見つけた色々な情報をまとめてみました。

以前、『BERTによる自然言語処理入門: Transformersを使った実践プログラミング』も買って、写経しながら試していたのですが、仕事であまり使う機会がなかったのであまり身につかなかったです。その反省も込めて、仕事でそのまま使えそうなレベルで備忘録としたいです。

Transformerについて
BERTについて
BERTを使うための色々
終わりに
参考情報

Transformerについて

ここでは仕組みと該当するコードについて見てみようと思います。TransformerはTransformer Encoderと呼ばれるニューラルネットワークのことをさします。Transformer Encoderはどのようなニューラルネットワークなのかと言うと、

  • 入力(エンコーダスタック)
    • Multi-Head Attention
    • 正則化
    • フィードフォワード
    • 正則化
    • 以上をN回繰り返す
    • 出力へ渡す
  • 出力(デコーダスタック)
    • Masked Multi-Head Attention
    • 正則化
    • 入力からもらう
    • Multi-Head Attention
    • 正則化
    • 正則化
    • 以上をN回繰り返す
    • 線形変換
    • ソフトマックスで確率出力

という構造のネットワークで、Attentionという機構が特徴となっています。

詳しい説明は、『Transformerによる自然言語処理』の第1章に記されています。加えて、元となっている“Attention Is All You Need”を読むと良いと思います。

Attentionが何なのかを理解する前に、RNNやLSTMやCNNのネットワークにはあるが、今回のTransformerのネットワークにはないものが何か考えてみると、再帰的な処理がないことがわかります。
もともとRNNなどは、ネットワークの隠れ層において再帰的な構造を持つことで前の状態を再び使いながら計算して学習していました。上の図を見れば、ぐるぐるとしていないことがわかると思います。

RNNなどはぐるぐると再起的に学習をして、単語ごとの関係性を学習していきますが、2つの単語の距離が離れるほどに計算時間がかかってしまうなどの問題がありました。Attentionは単語と全ての単語の間の関係をベクトルの内積で計算し、それを考慮することでこれまで以上に深く文脈を考慮した学習ができるようにしたものです。それに加えて、ベクトルを計算すればいいだけなので、並列処理もしやすく、計算速度の改善も利点としてあげられます。

Attentionの数式は以下の通りです。

$$Attention(Q, K, V) = softmax \left ( \frac{QK^T}{\sqrt(d_k)} \right ) V $$

Qはクエリベクトルで、元の入力データ(単語ベクトル)に重み行列\(W^Q\)を掛けて手に入れることができます。意味合いとしては検索をしたいもの。
Kはキーベクトルで、元の入力データ(単語ベクトル)に重み行列\(W^K\)を掛けて手に入れることができます。意味合いとしては、検索をするクエリと入力データの近さを示すもの。
Vは値ベクトルで、元の入力データ(単語ベクトル)に重み行列\(W^V\)を掛けて手に入れることができます。意味合いとしては、検索するクエリと入力データに応じた値。
\(d_k\)は次元数で、ベクトルの次元数が増えても重みが0になりにくいように、学習が進むようにするために割るために使われています。

QとKの内積が単語ごとの関連性をつかさどります。これらの値を代入して、softmax関数で返したものがAttentionとなります。参考文献の例では64次元となっています。内積を使って関連性を表現すると言うところは非常に親近感がわいて理解が捗ります。

しかしながら、なぜQ,K,Vに分ける必要があるのかいまいち腑に落ちません。こちらのブログ(【論文】”Attention is all you need”の解説)によると、モデルの表現力を高めるためとあるようで、KとVの関係について色々な変換を通じて、人間が想像できないレベルの関係性を拾おうとしているようです。

続いて、MultiHead Attentionの数式は以下の通りです。

$$ MultiHead(Q, K, V) = Concat(hed_1, \dots, head_h) W^O \\
where \ head_i = Attention(QW_i^Q, KW_i^K, VW_i^V) $$

MultiHead Attentionでは、複数のAttentionが連結されていることがわかります。
64次元のAttentionが8つあるので、MultiHead Attentionは512次元になります。
\(W^O\)は訓練される重み行列となります。
ここで、最終的に何を訓練しているかというと、例えば、英語に対するドイツ語のような、言語のペア、つまり翻訳をするというタスクの訓練をしていることになります。
なお、もととなる研究では言語のペアに関して、Byte-Pair Encoding (BPE)を行った上で学習をしています。
BPEはこちらの記事(Byte-Pair Encoding: Subword-based tokenization algorithm)の説明がわかりやすいです。

以上より、Attentionは翻訳という機械学習を行う過程で、深いネットワークを通じて、ある単語がどの単語に対して着目するべきかの重み付け(\(W^O\)の推定)を行っているとみなすことができます。

さて、出力(デコーダー)のMaskedがなんなのかと言うと、推論する際に、「文字列の位置において未来を見ないように処理をする」という意味で、具体的には隠すという処理です。ある文字列が出てきたところまでしか情報を持ち得ないため、このような処理をしていることになります。

ソースコードに移る前に、一つだけ忘れているところがありました。位置エンコーディング(Positional Encoding:PE)です。単語ベクトルにすることで位置情報を失ってしまっているため、それを補う処理が必要となります。

PEは埋め込みの各次元iごとに、位置情報としてサイン/コサイン関数で定義されます。

$$PE_{position 2i} = \sin \left ( \frac{position}{10000^{\frac{2i}{d_{model}}}} \right ) $$
$$PE_{position 2i+1} = \cos \left ( \frac{position}{10000^{\frac{2i}{d_{model}}}} \right ) $$

positionは単語の位置なので3つ目なら3、10個目なら10を取る値となります。iは位置エンベッディングの次元です。\(d_{model}\)は埋め込みベクトルの次元数で今回だと512となります。偶数はサイン関数、奇数はコサイン関数で表現する流れです。

とは言うものの、腑に落ちないのでもう少し調べてみます。この処理で十分にユニークな位置の情報を表現することができるのでしょうか。

以下の情報などが参考になりました。
What is the positional encoding in the transformer model?
Visual Guide to Transformer Neural Networks – (Episode 1) Position Embeddings

そこで紹介された図が以下のものです。

どうやら、サイン・コサイン関数は循環するので何度も同じ値をとることになりますが、エンベッディングの次元ごとに値が変わっていくようになっているので、その心配はいらないようです。

このPEの値を、埋め込みベクトルに足すなどすることで位置情報を失われることなく後に続くネットワークで活用できるようになります。

$$ y_1 = dog \\
pc(dog) = y_1 \times \sqrt d_{model} + PE(3) $$

というイメージです。\(y_1\)にかかっている値は、PEの影響が消えてしまわないようにするテクニックとされています。

なんとなく、全体感がわかったところでソースコードで確かめてみたいと思います。

今回は、attention-is-all-you-need-pytorchというリポジトリを見つけたので、そこを見てみます。以上で紹介した仕組みに関しては、https://github.com/jadore801120/attention-is-all-you-need-pytorch/blob/master/transformer/Models.pyのコードで扱われています。

こちらのコードは、Transformer、Encoder、Decoder、PositionalEncodingという4つのクラスからなります。
PositionalEncodingでは先ほどのサインコサイン関数での処理がそのまま書かれています。
Encoderでは先ほどの図の左のネットワークに関する処理が書かれています。
Decoderでは先ほどの図の右のネットワークに関する処理が書かれています。左のネットワークのアウトプットを途中受け取る処理などが確認できます。
Transformerではエンコーダーとデコーダーを介して線形変換した予測値を返す処理が書かれています。

別途、get_pad_mask関数を用いたパディング処理や、上三角行列に変換することで未来の単語を見えないようにする関数get_subsequent_maskなどもあります。

以上がコードですが、計算コストに関しても論文にあったので記しておこうと思います。論文によると、84万円くらいするGPU(NVIDIA Tesla P100)を8つ使って3.5日くらい回したそうで、推定したパラメータの数は1000万は軽く超えており、最大でも2億個くらいあるようです。
とてもではないですが、個人や月並みの企業では学習に関しては取り組み難いものであるのは間違いありません。民間企業のデータサイエンティストとしては、学習済みのモデルを使って、既存のNLPタスクなどをどう解決するかを頑張る道が賢明のようです。

BERTについて

BERTは登場して久しいですが、先ほど紹介したTransformerをもとに、双方向MultiHead Attention副層が追加され、デコーダーの部分(先ほどの図の右側のネットワーク)がなくされたものがBERTとなります。双方向の字面どおり、Bidirectional Encoder Representations from Transformersで頭文字をとってBERTと呼びます。


ネットワーク層としては先ほどのTransformerの左側(エンコーダー)だけの形となります。

BERTは学習のために二つの手段を取ります。一つ目はマスク付き言語モデルです。双方向という表現は、ネットワーク間でランダムに単語をマスクして、それを予測するために学習し合うというところから来ています。二つ目は次文予測(Next Sentence Prediction)で、ある単語からなる系列の後に次なる系列が続くのかどうかを学習します。
これら二つを組み合わせてNLPタスクを解くために学習をするという流れです。具体的なタスクとしては、文章と文法のペアなどを学習用データとして、文章から文法を当てるというタスクなどです。

BERTのPyTorchでの実装は、こちらのGitHub(BERT-pytorch)にありました。詳細は記さないですが、model/bert.pyのところに、マスク付き言語モデルの部分、次文予測の部分が実装されていることが確認できます。

BERTを使うための色々

仕事で使えそうなものがいいので、学習済みのBERTを使って日本語のNLPタスクを行うためのコードをこしらえてみました。

『BERTによる自然言語処理入門: Transformersを使った実践プログラミング』という書籍の第6章に文書分類(記事のカテゴリ分類)を、日本語の学習済みBERTで実践するコードが記されていますので、困ったらこのコードを見て日々の仕事をすればいいかもしれません。
こちら(BERT_Chapter6.ipynb)は、Google Colabで写経したもので書籍にあるものと同じです。

以下、マルチラベル文章分類の7章の写経Colab(BERT_Chapter7.ipynb)と固有名詞抽出の8章の写経Colab(BERT_Chapter8.ipynb)もあるので、合わせてここぞと言う時に使いたいと思います。

他にも、BERTのハンズオン資料を見つけました。こちらも日本語のNLPタスクを行えるチュートリアルなので、業務で使う際に参考になりそうです。
huggingface transformers を使って日本語 BERT モデルをファインチューニングして感情分析 (with google colab) part01
huggingface transformers を使って日本語 BERT モデルをファインチューニングして感情分析 (with google colab) part02

終わりに

今回は、いまさらながらTransformerとBERTについて情報を色々集めてみました。推論時に十分な速度を出せるのかまだ判断がつくレベルで使っていないので、今後は色々な分析課題に適用して、Word2Vec並みにリーズナブルな分析アプローチとして業務に組み込んでいきたいですね。
Word2Vecを夜な夜な会社のパソコンで学習して2日くらいかけたのは、もう8年も前の話で非常に懐かしいです。Transformer系となると計算資源的に厳しいものがありますが、どうにか学習させてみたいとも思っています。

参考情報

Attention 機構を用いたDeep Learning モデルによるひび割れ自動検出
Transformerにおける相対位置エンコーディングを理解する。
【論文】”Attention is all you need”の解説
Transformerのデータの流れを追ってみる
A Gentle Introduction to Positional Encoding In Transformer Models, Part 1
TORCH.TRIU
huggingface transformersで使える日本語モデルのまとめ
huggingface transformers を使って日本語 BERT モデルをファインチューニングして感情分析 (with google colab) part01
huggingface transformers を使って日本語 BERT モデルをファインチューニングして感情分析 (with google colab) part02

Flaskでイコちゃんペリー画像分類器の予測結果を返す

はじめに

先日の記事で作ったイコちゃんとペリー分類器ですが、今回は画像ファイルを送れば分類結果が返されるFlaskのAPIを作ってみようと思います。すごく簡単にできそうな記事を見つけたので、そこで紹介されていたコードを使います。

前回のおさらい

前回は、ペリーの画像27枚、イコちゃんの画像20枚を集めKerasでVGG16を使って分類器を作りました。テストデータもペリー9枚、イコちゃん7枚の計16枚と用意し、F1スコアは0.705くらいでした。画像を集めるのが面倒なのと、GPUを持っていないので更なる精度向上はいったん目指しておりません。

Flaskとは

FlaskとはWikipediaによると、「Python用の軽量なウェブアプリケーションフレームワークで、Djangoの次に人気がある。」とあります。学習済みモデルで推論の処理を受けつけ、その結果を返すということにしか関心がないデータサイエンティストとしては、ウェブアプリケーションフレームワークをわざわざ学びたいものではないですが、データサイエンス界隈ではしばしば見かけることから、学ばざるを得ないなと思います。
Flaskには「処理を受け付け、結果を返す」というただそれだけの関心で向き合っていく次第です。
公式ドキュメントはこちら(Welcome to Flask — Flask Documentation (2.0.x))になります。
そういえば以前、「[第3版]Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)」という書籍でFlaskを用いたレコメンドAPIを時間制限のある無料のサーバ(PythonAnywhere)で実装したことはありましたが、CSSやHTMLを色々設定して面倒だなという印象がありあまり記憶に残っておりません(笑)。

今回の処理

この記事のソースコードはこの記事、「How to Build A Machine Learning API Using Flask」から使わせていただきました。ローカル環境で機能するAPIをFlaskで作るというものです。

ざっくりとした処理の流れとしては、
学習済みモデルの読み込みをした状態で、
入力された画像を前処理し、
推論を行い、その結果を返すというものです。

ソースコード

さて、学習済みの画像分類モデルで、画像を受け付けて推論し、結果を返すコードは以下の通りとなります。

こちらのソースコードをapp.pyのファイル名で保存して、
コンソール上で

と実行すれば、FlaskのAPIサーバが立ち上がります。
今回はローカル環境なので、ブラウザで
http://0.0.0.0:5000/
を表示すればサーバが起動しているのを見れます。
さて、肝心の画像分類ですが、
コンソール上で以下のようにcurlコマンドを叩けばローカルのサーバから推論結果が返ってきます。–formという引数で’file=@”/perry_image/test/ikochan_test_8.jpeg”‘みたいにローカルのファイル名を指定して実行する形となります。

1なので、この画像はイコちゃん判定されました。過去の記事にもあるように、正解率は11/16くらいなので、69%と微妙ですけども。
今回はローカルサーバですが、Webサーバ上で起動すれば、機械学習を用いたツール開発が実現できますね。
なにより、思ったよりも短いコードで実現できてしまうことに驚きました。推論などの処理は基本的にPOSTのところに書く感じです。

今後:本番運用に必要なことについて

仕事で使うとなると、このコードを載せるサーバとかセキュリティ周りをどうするかというのが気になります。処理回数の制限とかIP制限とか認証キーとかどうするのか。
URLが流出するかもしれないし、誰かがDOS攻撃とかしてくる人がいるかもしれないし。
データ分析をするだけのご身分ではこういったことを考えることはないですが、データサイエンティストという職種に求められるスキルが少しずつ広がっていくのは面白いとも思えるので、粛々と向き合っていきたいです。

最近、「Python FlaskによるWebアプリ開発入門 物体検知アプリ&機械学習APIの作り方」という書籍が出ていたので、ポチりました。本番で運用する観点でどういったリスクを潰しておくべきか、この本から学んで実装までいけるといいなと思います。

参考情報

[第3版]Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)
How to Build A Machine Learning API Using Flask
GETとPOSTの違いについて

OpenCVで遊んだり、Kerasで「かものはしペリー」と「イコちゃん」の画像分類をするの巻

はじめに

正月は帰省もせずに暇だったので、普段の業務ではほとんど扱わない画像関連でブログを書いてみようと思います。
まず、よくありそうなOpenCVの適用や、DNNを用いた画像分類などを行います。扱う画像は当然、かものはしペリーのぬいぐるみです。ブログのタイトルやドメイン名になっている通り、私はかものはしペリーの愛好家です。
この記事の読者層は私で、いつか仕事で使うのをイメージして備忘録として残す感じです。
説明があまりありませんが、気分次第で追記するかもしれません。あしからず。

OpenCVで行うあれやこれや

インストールする

これで入ります。

画像を読み込んでRGBにする

明度値の書き換え

量子化

グレースケール

画像ヒストグラム


HSV変換について
・Hue:色の種類(例えば赤、青、黄色)
・Saturation:色の鮮やかさ。色の彩度の低下につれて、灰色さが顕著になり、くすんだ色が現れる。
・Brightness:色の明るさ。

明度変換

フィルタ処理

特徴点検出

画像の中から特徴的なポイントを抽出するアルゴリズム。

マッチング

特徴量抽出

・BFMatcher:Brute-Force matcher(総当たりで特徴点を比較している。類似度は数値が低いほど類似しているとみなす。)
・AKAZE:日本語の『風』から命名された手法。二つの画像のキーポイントを発見するために使われる。変化への耐性が強いとされる。非線形拡散方程式を近似的に解いて、非線形スケール空間の特徴量を検出している。

これがベースとなるペリーの画像。

以下では、このペリーとの類似度を計算している。

画像分類

ペリーとイコちゃんの画像からペリーかどうか判定したい。
今回はペリーの画像27枚、イコちゃんの画像20枚を用意しました。

今回はKerasにある、VGG16というモデルを使って分類を行います。ハイパーパラメータはAdamです。reluとかドロップアウト層とかは参考文献のまんまを使っています。

ファイルの読み込みです。
trainというディレクトリにperry_とかikochan_とかからなる画像ファイルがある想定です。

画像からの学習用のデータの作成。

学習の実行。


テストデータにモデルを当てはめて推論し、精度をみます。今回はテストデータとして別に、ペリー9枚、イコちゃん7枚の計16枚の画像を用意しました。
果たしてペリーとイコちゃんを識別することはできるのでしょうか。

・Accuracy:0.688
・Recall:0.857
・Precision:0.6
・F1:0.705

どうなんでしょう。まずまずなんでしょうか。

間違えたやつがどれか確認

仕事で使う機会があるようなないような画像の世界ですが、計算資源が大事だなと思いますね。

参考情報

テキスト・画像・音声データ分析 (データサイエンス入門シリーズ)
Display OpenCV Image in Jupyter Notebook.py
Python でグレースケール(grayscale)化
OpenCV で画像のヒストグラムを作成する方法
HSV色空間
色空間の変換
画像フィルタリング
OpenCV: 特徴点抽出とマッチング
キーポイントとマッチの描画関数
OpenCVのAKAZEで顔写真の類似度判定をやってみた
総当たりマッチングの基礎
OpenCV3でAKAZE特徴量を検出する
KAZE Features
小惑星画像の対応点決定を目的としたSIFTとAKAZEの性能比較
線形・非線形拡散方程式の差分解法と解の可視化
AI技術を魚種の画像分類に応用してみた!
ベクトルの内積や行列の積を求めるnumpy.dot関数の使い方
Python | Count of common elements in the lists
[解決!Python]リストの内包表記と「if」を組み合わせるには
Convert png to jpeg using Pillow
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type int) in Python
Pythonで文字列のリスト(配列)の条件を満たす要素を抽出、置換
ImportError: cannot import name ‘adam’ from ‘keras.optimizers’
pandas.DataFrame
Pythonでenumerateとzipを組み合わせて同時に使う

各業界でのデータサイエンスの活用について調べてみた(随時追加)

仕事で、いろんな会社でデータサイエンスってどう使われているのですか?と聞かれることがあり、自分としてはなんとなくしか掴めていないな、知ったかぶりしたくないなと思うところがあったので、やや手厚くリサーチをしてみようと思いました。

2022/3/6の段階では11つの市場しかないですが、最終的には30市場を目指します。

【2021/11/27追記】
公開したところ、それなりにこの記事に関心を持ってくださった方が多かったようなので、少しずつ事例を埋めていこうと思います。

業界別のページ内遷移

自動車・同附属品製造業
建設
不動産
医療(医薬品の卸)
生命保険
外食
物流
BtoC-EC
電力
電気通信
スーパー

業界別にデータサイエンスの事例を集めてみる

・業界としては、市場規模マップの上位30の市場としてみる

事例の調べ方

各業界の売上1~2位の企業名とデータサイエンス系キーワードを掛け合わせGoogle検索ないしGoogle Scholar検索を行う。

  • Google検索を自動で行う。
    • 「かものはし製パン 機械学習」
    • 「かものはし製パン 人工知能」
    • 「かものはし製パン データサイエンス」
  • 30業界2社の3つのキーワードごとの検索結果上位30位を取得
    • 計5400の検索結果から求人などを除外
    • 不要なものを除外したリストから目視で精査、まとめ

検索自動化のソースコード

一応、Google Scholarの検索自動化のためのPythonコードを置いておきます。クローリングのお作法などは「Pythonクローリング&スクレイピング[増補改訂版] -データ収集・解析のための実践開発ガイド-」のような本で身につけておくと分析関連業務で楽になります。

総務省の白書に関してコメント

日本企業におけるデータ活用の現状」という総務省が出している2020年3月のアンケートに基づいたレポートがあるのですが、なかなか良い統計が載っていて、日本全体の会社におけるデータ活用度をある程度掴むことができると思いました。

どうやら大企業の半数近くは経営企画や製品企画、マーケティングにデータを活用していて、大企業の2割の企業で機械学習を用いたデータ活用を行なっており、大企業の5割の企業でデータ分析専門の部署があるようです。
データ分析が、かなり社会に浸透しているのだなと思われました。
そして、多くの企業の関心事がデータの質になってきているようです。データ分析で重要な観点にしっかり関心が高まっているのは良いことですね。

業界ごとの取り組み

以下では業界ごとに事例などをまとめていきます。結構長くなりそうです。

自動車・同附属品製造業

数理工学や群体数理、行動経済学など幅広い領域を研究対象としている。

  • シミュレーションを活用した制御ソフトの自動検証技術
    • サーチベーステスト(SBT):自律走行ロボットが充電ステーションへ帰還する際に、自己位置の推定に誤差が生じる課題を抱えていたが、SBTを用いることで推定誤差が生じる環境要件を特定してソフトの誤差80%減を実現していたりする。
  • 機械学習による性能テストの効率化
    • エンジンの燃焼に関するシミュレーションの実行時間の短縮を機械学習で行う。シミュレーションの効率化が積極的に行われている。
  • 歩行者保護性能の評価試験
    • ボンネットの設計効率化に向けて、CAE(computer-aided engineering)で構造解析を行う前に、ある程度の歩行者保護性能をAIで判定できるようにする取り組みが行われている。
  • Positive-confidence(Pconf)分類
    • アプローチとしては、正例の分布とその信頼度だけで、分類ミスによって生じる損失の期待値を最小化する手段。
    • ドライバーの心電情報から眠気を推定する際に用いた
  • 深層強化学習
    • 自動運転の際に、「ぶつからない」ことを学習する分散機械学習
  • 車内にカメラやマイク、脈拍センサーなどを置き、乗員の行動や会話、生体情報などを把握する開発
    • 自動運転車からデータを集めてAIで解析すると、人の行動や嗜好、健康状態、さらには感情まで推定
    • 感情エンジンを開発し、ドライバーの表情や声の調子からストレス状況を判断して安全運転をサポートしたり、ライフスタイルでの嗜好を学習して、状況に応じた選択肢を提案する。

建設

  • スマートハウス
    • 既存のIoT機器やWebサービス、建物内に設置するデータ収集サーバを連携し、個々の機器・サービスを統合するシステムを構築し、家電の遠隔操作や省エネアドバイスなどの生活サービスをユーザーの好みに応じてカスタマイズできるシステムや、音声認識による機器操作、情報配信等のサービスにつなげる。温度センサとエアコンや電動窓を連動し真夏の寝苦しさを解消するなども。
    • HEMS(Home Energy Management System)の規格のもと、IoTデバイスを起動させるケースが多い。音声認識を用いたアプリケーションや気象や様々なセンサーを基にした家電の最適化などが扱われる。
  • 施設内の映像解析
    • 施設内に設置したカメラ映像から利用者のマスク着用や施設内カフェテリアの混雑度を自動で検知する実証実験を行っている。モニターでリアルタイムの映像を確認できるが、個人情報保護の観点から人物はシルエット表示されないとのこと。なお、実証実験で利用するカメラ映像は2カ月間保存・利用し、期間終了後に消去する。
  • マンションにおける電力供給システムの最適化
    • 家庭向けの発電設備の稼働を、過去の電力使用データなどから最適制御を行い、遠隔でコントロールする。生活リズムごとに家庭をクラスタリングしている。
  • 在宅健康モニタリング
    • 在宅健康モニタリングと早期発見システム(Early Detection System = EDS) の推進に特化したプログラムを構築のために大学と共同研究

不動産

  • 不動産価格の算出のための機械学習システム
    • 所有マンションの推定成約価格を機械学習で算出して提示するシステムがWebサイトで提供されている。過去の制約事例のデータから予測している。
  • 賃料推定のための機械学習
    • 賃貸仲介データ等が少ない都心商業施設を対象に賃料を推定できるシステムが開発されている。
  • 間取りの検索システム
    • ユーザーに適した間取りの物件をレコメンドできるシステム。画像処理技術を間取りのデータに対して適用している。洋室や和室なども分類されている。

医療(医薬品の卸)

  • 機械学習を用いた、工場における医薬品の物流最適化(医薬品の卸の会社)
    • 商品(医薬品)の保管・払い出し・仕分けなどの作業を自動化する、ピッキングロボットを開発し、人間の2〜5倍の作業量をこなしている。
  • 医薬品の出荷予測
    • 過去数年分の医薬品の出荷データをもとにGCPで機械学習を行い、余剰在庫や欠品リスクを回避させようとしている。
  • 医薬品の配送の最適化
    • 医薬品の販売、物流、商品、需要トレンドのデータを用いて機械学習を行い、注文数や配送発生確率、納品時の滞在時間を予測できるようにした。

生命保険

  • 保障設計のレコメンドシステム
    • 保障設計予測モデルを構築し、顧客の意向に基づいて保障プランをレコメンドする。過去の大量なデータを用いて、保険において重視したい保障内容や保険料の予算をもとに、保障プランを自動生成。
  • 保険の保障見直しのためのレコメンドシステム
    • 未熟練な保険のプランナーの業務を支援するアプリケーション。年齢、性別、家族構成はもちろん、保険の保障設計書などのテキストも学習用データにしている。
  • Human in the loop
    • 機械学習システムは完璧なものではないので、人間の仕事を補助するなど、飛行機における管制システムのような存在として共存するという考え方。営業職員が多い生命保険会社では重要な観点。営業職員がベテラン層の営業職員と比肩するコンサルティングをより適切なタイミングで実施しやすくするリコメンド機能などがそれにあたる。
    • 最適な提案のタイミング、最適な活動レコメンド、最適な教材・資料探しなど、営業活動の支援のための分析に取り組む事例がそれなりになる。最適な顧客訪問、最適なメッセージなどを見つける。
  • 入院日数予測モデル
    • 保険加入時の健康状態(告知事項や健診結果など)と保険給付実績を分析し、加入時の健康状態から将来の生活習慣病における入院日数を予測するモデルを開発。このモデルを用いてリスクを評価できるようになり、これまで引き受けれなかった顧客からの申し込みを引き受けることが可能になった。
  • 営業の教育支援ツール
    • AIを相手にしたロールプレイング演習などを行い、新人の育成を支援するツールなどが作られている。
  • 保険の引き受け査定の自動化
    • 健康診断結果報告書や人間ドック成績表をもとに、OCRでデータを抽出し、それらのデータをもとに機械学習を用いて自動での医務査定を行えるように訓練。これまで2〜3日かかっていた査定業務が3分以内に完了するように。

    外食

    • 配送員向けアプリ
      • 機械学習を用いて、ベテラン配達員のデータから学習し、配送員にとって効率の良いルートを提案するアプリ。
    • 機械学習を用いたクーポン配布
      • 顧客ごとの来店確率を計算し、その確率が上位の顧客にクーポンを送付するという施策を試験的に展開している。コンバージョンレートが通常の3倍になったケースもあるとのこと。天候や気温などのデータとも連動しているとのこと。
    • 注文の需要予測
      • 過去の注文履歴を分析し、宅配需要を10分単位で予測したり、配達ルートの最適化を行う取り組み。フードロスを減らすこともモチベーションとしてある。
    • レコメンドとしてのデジタルメニュー
      • 顧客の登録情報や来店時刻や立地ないし季節・天候に応じて、客ごとにメニューが変わるようなレコメンデーションを試験導入しているとのこと。

      物流

      • 強化学習を用いた船舶の航路の最適化
        • 膨大な数の航海シミュレーションを通して、徐々に最適な避航行動を学習し、様々な状況下で安全性と経済性に優れた避航操船行動を選択できるプログラムの開発などが進められている。航路作成は人間だと3時間かかるらしい。
      • 画像解析による船舶の見張り支援システム(衝突回避のため)
        • 船上で撮影された映像に対して、サーバー上で画像を解析し機械学習を実施後、その物体との距離を求めてから、遠隔で船上ソフトウェアを更新することで、利用しながら認識率等の性能が向上する仕組み。
      • 船体の異常検知の自動化
        • IoTで航海データ・機関データを取得し、船舶の運航管理者が船舶の異常を検知できるように機械学習の導入を進めている。これまでは人間が24時間体制で管理していた。
      • 業務量の予測
        • 宅急便の拠点における、数ヶ月先の業務量を予測するため、機械学習モデルを毎月アップデートし、需要に応じた効率的な経営資源の最適配置とコスト適正化を推進することを目指している。
      • 作業員の業務日報のOCR
        • 紙の作業日報の情報のシステム入力を自動化するために、機械学習を用いたOCR技術を適用している。

      BtoC-EC

      • 商品の非構造化データを構造化データにする、あるいは商品情報の自動生成、自動判別
        • 機械学習(CNN、RNN)や自然言語処理をもちいて、商品から情報を抽出したり、レビューを分析したり、商品のカテゴリを分類したりしている。商品の画像のデータからカテゴリを予測するなども行われている。
        • 出品時に登録した商品の写真画像から、商品の内容などの入力候補を提示する機能などが開発されている。ディープラーニングとk近傍法などを組み合わせた事例がある。
      • 潜在的に購買する可能性があるユーザーの推定
        • 機械学習を用いて金融サービスを使って購買をしそうなユーザーを分類するモデルを作成し、予測スコアが一定以上のユーザーに介入するなどを行っている。
        • 機械学習を用いた独自のアルゴリズムで消費行動を解析することで、購買の見込みがあるユーザーを抽出するなどし、商品の広告配信に活かしている。
      • 動画コンテンツの翻訳
        • アテンションの伴ったRNNでの機械学習を行い、中国語を英語に変換している。
      • 商品推薦システム・パーソナライズドクーポンアルゴリズム
        • 商品データ、購買履歴データ、閲覧履歴データを対象とし、古典的な相関ルール抽出、あるいはMatrix Factorizationを適用させたり、商品やユーザなどを固定長のVector に変換して距離を計算するEmbeddingなども行い、RNNなどの深層学習アルゴリズムを適用している。
      • チャットボットによるサービス利便性の向上
        • ユーザーが知りたい問い合わせの多くにチャットボットが回答している。FAQを情報源としてNLPなどを用いてその中から一番近い答えを返している。
      • 多椀バンディットアルゴリズムを用いたABテストの最適化
        • T.B.A
      • 在庫数の最適化のための商品需要予測
        • T.B.A
      • 異常検知
        • T.B.A
      • 商品価格の推定
        • 出品された商品に対して、Factorization Machinesというレコメンドシステムでよく利用される手法の一種であるDeepFMを用いた価格の予測が行われている。機能によっては端末のアプリ側で計算を行うことから、エッジコンピューティングのためのモデル軽量化なども進められている。
      • 不正検知
        • 違反出品検知システムとして、Human-in-the-Loopを実践。人間が介入するため、判定するべき対象とその他との境界に位置するデータに対してのアノテーションを継続的に入手している。アルゴリズムとしてはDNNを用いている。

      電力

      • メッシュ単位での電力需要予測
        • メッシュ単位での気象予測データを活用して電力需要の予測精度を高めるように、スパースモデリングやアンサンブル学習の機械学習技術が使われている。解釈可能性も重視されるので、一般化加法モデルなども利用されている。なお、電力需要量は、カレンダー条件(時間帯,曜日など)と気温や日射強度などの気象条件からおおむね推定できるとされている。機械学習系の手法もあれば、周期性に着目し、状態空間モデルで予測する事例もある。
      • 機械学習による石炭火力発電所における燃焼調整の体系化
        • 運転データやオペレーションとメンテナンス(O&M)の知識をもとに、設備の燃焼効率最適化を機械学習で行う。
      • 機械学習を用いたダム操作最適化システム
        • ニューラルネットワークを利用したダム操作最適化システムの研究がされている。雨量予測、河川流量予測、ダム操作最適化の三つの領域での最適化がなされている。最適化操作のために強化学習も採用されている。学習期間の報酬を最大化するようにネットワークの重みを修正している。
      • 異常検知
        • ヘリコプターやドローンなどで撮影した送電線の動画データを基に、軽微な損傷や異物の付着といった異常を見つけ出すために深層学習が使われている。誤判定のチェックに多少の人手をかけても、十分な業務時間の短縮効果を得られるとのこと。
        • 工場設備の温度変化のデータを画像化して、CNNで特徴量を作り、不具合や異常の分析を行うなどしている。
      • 太陽光の発電量予測
        • T.B.A
        • T.B.A
      • 大量のデータを駆使しての設備の劣化予測診断
        • 高クロム鋼配管溶接部のクリープ損傷評価を深層学習(AlexNet)やサポートベクターマシンを用いて行っている。学習用のデータが少ないことから、転移学習も行っている。
        • T.B.A
      • 燃料プロセスの最適化
        • ボイラ燃焼調整の最適化等
        • 熟練技術者が半日程度かけてつくっている燃料の運用計画を数分で行えるように数理最適化などの取り組みがされている。
      • 生活リズムの変化を察知
        • スマートメーターにある電気使用量の時系列変化を捉えて、独居している人の異常を親族に通知する仕組みを構築している。
        • 高齢者を介護する負担を減らすための実証研究などが進められている。
      • 電力の需要予測
        • 特徴量としては、カレンダー情報・気象情報それらを組み合わせた相互作用項で、重回帰モデルと一般化加法モデルに対してアンサンブル手法を適用している。
        • k-nearest neighborでの距離的な離れ具合でもって、異常な需要を当てるなどの取り組みがされている。それと重回帰ベースのモデルとを合わせて予測している。

      電気通信

      • 機械学習モデルの公平性
        • 人を対象とした意思決定に関する過去の履歴(訓練データ)と、矢印(因果グラフ)によって「どんな予測が不公平か」に関する事前知識を表現したものを入力として受け取り、公平な予測を行う機械学習モデルを出力している。
      • 深層学習モデル
        • どのような条件で取得されたデータであるかがまったくわからない寄せ集めの学習データからであっても、認識モデルを学習可能な深層学習技術を実現。Data Augmentationの適用をした模様。
      • 料金未納などの連絡Bot
        • 「AI電話サービス」が対象者に対し、本人確認、支払い意思、支払日などを確認し、確認結果をCSVにて出力。電話に出ない債権者は自動で再架電話リストとして登録し、再度架電を行うとのこと。
      • 音声のノイズに関する分析
        • ロボットが受け取る人間の音声に関して、構成する音の雑音のカテゴリを機械学習で分類するという取り組みが行われている。メル周波数ケプストラム係数(MFCC)を用いて、それを元に機械学習アルゴリズムとしてDNNやSVMなどを試している。
      • 通信障害の異常検知
        • 既存の監視システムでは検知できないような通信障害を検知するために、SNSなどの情報をもとに、そのSNSの情報に機械学習を用いて分類を行い、通信に異常があるかどうかを判定する研究がなされている。アルゴリズムとしてはSVMが使われている。
      • 圧縮化技術
        • 電波の到来方向を高速で検知するために、それらに関連する情報圧縮のためにニューラルネットワークなどの機械学習を適用している。

      スーパー

      • 需要予測・発注最適化・在庫管理最適化
        • 食パン、牛乳、豆腐、冷凍食品などのデイリー品を中心に需要予測の実証実験とあり、発注にかかる時間を1/3ほど短縮できたとある。アプローチとしては機械学習に解釈可能性を持たせたものらしい。人の発注業務を支援するという観点から予測性能だけでなく、解釈可能性も大事なのだろう。
      • ATMへの機械学習の実装
        • スーパーの店内にある、各ATMの入出金予測を行っている。ここでも機械学習の解釈可能性を大事にしており、どれくらい現金を保持しておくかを人間が決めるのを支援する仕組みのようです。ちなみに、現金の補充は警備会社が行っているらしい。
      • 店内カメラの解析
        • 店舗によっては数百のカメラで解析しているらしい。売り場への立ち寄り時間などを分析して、店内レイアウトの改善に使ったり、店員の所持するアプリに困っていそうなお客さんを検知して通知を飛ばすなども行っている。また、混雑の検知などにも使われたり、映像から年齢を推定し、未成年への酒類販売を未然に防ぐなどにも活用しようとしているらしい。
      • 配送ルートの最適化
        • 運転手の割り振りや受取場所、時間を最適化するほか、注文時間などに応じて宅配料金が変動する仕組みも試しているとのこと。
      • 割引率の最適化
        • 販売実績や天候・客数などの環境条件を学習し、時間帯ごとに各商品の陳列量に応じて適切な割引率を提示するツールの開発もなされている。

      BLSTMを用いた文書分類でデザイナーズマンション予測に再挑戦

      はじめに

      仕事で深層学習を使うことはないのですが、扱える技術の幅を広げていきたいなと思い、BLSTMを用いた文書分類についてkerasでの簡単なサンプルコードをやってみようと思います。データは以前集めた、某不動産紹介サイトの賃貸マンションの設備に関する文書とそれがデザイナーズマンションかどうかのラベルを使います。そして文書内の単語からその文書がデザイナーズマンションかどうかを予測します。前回はAUCで83%だったので、それを超えれると良いですね。

      目次

      単純なRNNとは

      • モチベーション
        • フィードフォワード型のニューラルネットワークではうまく扱うことができない時系列データをうまく扱えるようにすること。
      •  特徴
        • 入力が互いに関係している(多層パーセプトロンの際は置かれていない仮定)
          • 直訳すると循環するニューラルネットワークとなる。
        • 最初の文の単語が2つ目、3つ目の単語に影響を与える可能性を考慮。
        具体的な関数の形としては、 $$ h_t = \tanh (W h_{t-1} + U x_t) \\\ y_t = softmax(V h_t) $$ で与えられる。
        \( h_t \)は隠れ層の状態を、\( x_t \)は入力変数を、\( y_t \)は出力ベクトルを表している。(他のアルファベットは重み行列)

      LSTMとは

      • モチベーション
        • 単純なRNNの勾配消失問題を解決するために提案された手法。
      • 特徴
        • 単純なRNNに置き換えることで性能が大幅に向上することも珍しくない。
          • 時系列データ、長い文章、録音データからなる長期的なパターンを取り出すことを得意としている手法。
        • 勾配消失問題に強い
        • Long Short-Term Memory:長短期記憶
          • 長期依存性を学習できるRNNの亜種。
          • 入力ゲート、忘却ゲート、出力ゲート、内部隠れ層という4つの層が相互に関わり合う。重要な入力を認識し、それを長期状態に格納すること、必要な限りで記憶を保持すること、必要なときに記憶を取り出すことを学習する。
            • 入力ゲート:内部隠れ層のどの部分を長期状態に加えるかを決める。
            • 忘却ゲート:長期状態のどの部分を消去するか決める。
            • 出力ゲート:各タイムステップで、長期状態のどの部分を読み出し、出力するかを決める。
      $$
      i = \sigma (W_i h_{t-1} + U_i x_t) \\
      f = \sigma (W_f h_{t-1} + U_f x_t) \\
      o = \sigma (W_o h_{t-1} + U_ox_t ) \\
      g = \tanh (W_g h_{t-1} + U_g x_t) \\
      c_t = (c_{t-1} \otimes f ) \otimes ( g \otimes i) \\
      h_t = \tanh (c_t) \otimes o
      $$ i:入力ゲート(input)
      f:忘却ゲート(forget)
      o:出力ゲート(output)
      \( \sigma \):シグモイド関数
      g:内部隠れ層状態
      \(c_t \):時刻tにおけるセル状態
      \(h_t \):時刻tにおける隠れ状態

      Bidirectional LSTMとは

      • モチベーション
        •  従来のRNNの制約を緩和するために導入。
      • 特徴
        • ある特定の時点で過去と将来の利用可能な入力情報を用いて訓練するネットワーク
          • 従来のRNNのニューロンをフォワード(未来)なものとバックワード(過去)なものとの2つに分ける。
            • 2つのLSTMを訓練している。
          • 全体のコンテキストを利用して推定することができるのが良いらしい。
            • 文章で言うと、文章の前(過去)と後(未来)を考慮して分類などを行うイメージ。
          • 人間もコンテキストを先読みしながら解釈することもある。
        • BLSTMは全てのシークエンスの予測問題において有効ではないが、適切に扱えるドメインで良い結果を残す。
        • 1997年とかなり歴史があるものらしい
      出典:Deep Dive into Bidirectional LSTM

      Bidirectional LSTMで文書分類

      今回は、BLSTMを使って、マンションの設備に関するテキスト情報から、そのマンションがデザイナーズマンションかどうかを予測します。全体のソースコードはGoogle Colabを御覧ください。

      データ

      データを確認してみると、
       
      今回のデータがテキストとラベルからなっていることがわかる。なお、データ数は1864件あり、そのうち16%がデザイナーズマンションです。

      前処理

      Google Colab上で形態素解析を行うために、MeCabをインストールする。
       
      これでMaCab NeologdをGoogle ColabのPythonで実行できます。
      テキストデータの前処理を行うために名詞だけを抽出してリスト形式で返す関数を定義します。
       
      ここで、語彙に関するデータを作成します。
       
      続いて、単語とそのインデックスからなるdict形式のデータを作成します。
       
      最後に、これまでに作成した語彙とそのインデックスのデータを用いて、実際に学習に使う入力データと出力データを作成します。
       

      実行

      先程作成したデータを訓練データとテストデータに分けます。
      ここで、AUCを計算するための関数を定義します。(まるまる拝借しました)
      続いて、kerasを用いて、ネットワークを構築し、コンパイルを行います。
        テストデータでの予測精度を確認します。
      実際のラベルとテキストデータを見比べてみます。
      LSTMの場合は、BLSTMに関する記述(1行)をネットワークから除外すれば良いので簡単に試すことができます。 せっかくなので比較してみたところ、AUCは0.841でした。BLSTMは0.844だったので、若干上回る程度のようです。 以前扱った記事ではデザイナーズマンション分類はAUCが0.83程度だったので、LSTMを使ったほうが精度が少しだけ高いようです。

      追記

      TensorBoardの検証のloglossを見てみます。 エポックに対してloglossが非常に荒れています。学習曲線としてはセオリー的にアウトなようです。一方で、検証のAUCはエポックに従って高まるようです。 AUCは良くなっているけどloglossが増え続けている。loglossが下がらないと過学習している可能性が高いので、これは過学習しているだけなのだろう。

      参考文献

       

      2019年に読んだデータ分析系の本の振り返り(21+1冊)

      はじめに

      2020年、あけましておめでとうございます。年末に自分自身を振り返ろうと思ったのですが、結局データ分析と勉強しかしていないわけで、書籍を振り返ろうと思うに至りました。私の知り合いのデータサイエンティストはだいたい全冊持っているであろうと思われますが、良い本だと思うので思い出していただければ幸いです。

      1.『ベイズモデリングの世界』(岩波書店)

      基本的に階層ベイズモデルを使って、個体ごとの異質性を考慮した分析手法が提案されています。前半はオムニバス形式で様々な先生がモデルの適用について執筆されており、後半では伊庭先生による階層ベイズモデルの講義になっています。途中でスタイン統計量による縮小推定の話があげられ、柔軟なモデリングのためには「階層化した方が少なくとも望ましい推定量が得られる」という数学的証明を捨てることもやむを得ないと書かれています。

      2.『トピックモデルによる統計的潜在意味解析 (自然言語処理シリーズ) 』(コロナ社)

      この本はトピックモデルの教科書というよりも、ベイズ推定の教科書という側面が強い印象があります。途中で出てくる数式は流し読みするのは難しく、最低2冊以上のノートが別途必要になると思います。一度でもLDAのパラメータを導出してみたいという方には良い教科書だと思います。疑似コードが提供されているので、それをもとにRやPythonでコーディングしていけば、一番シンプルなLDAが非常に短い行で実行できてしまうことに驚かれるかもしれません。人間が手を動かして推定アルゴリズムを導出しているからこそ、短いコードで済むということを実感できるはずです。

      3.『構造的因果モデルの基礎』(共立出版)

      グラフィカルなアプローチで因果推論を扱っている書籍です。Judea Pearl流の因果推論アプローチについて記すことを目的に書かれています。基礎と書かれていますが決して簡単ではありません。ただ、扱われる数学のレベルとしては確率と線形代数がわかれば大丈夫だと思われます。余談ではありますが、1章の相関関係と因果関係の事例紹介で「おむつとビールの話」が都市伝説ではなくきちんと記事としてWall Street Journalという雑誌に掲載されていたことが明らかにされています。

      4.『現場で使える!PyTorch開発入門 深層学習モデルの作成とアプリケーションへの実装 (AI & TECHNOLOGY)』(翔泳社)

      PyTorchを触ったことがないが、深層学習の手法について知っている層を対象とした本です。6章まではGoogleのColabで動かせるのでGoogleに課金することなく深層学習による回帰、CNN、GAN、RNN、Encoder-Decoderモデル、ニューラル行列因子分解をPyTorchで試すことができます。写経したものはこちら。転移学習や高解像度化や画像生成、文章のクラス分類、文書生成、機械翻訳などもできるので、PyTorchでこれくらいの量をコーディングしたらこれくらいのことができるのかという学びや、他の人の書いたPyTorchコードを読みやすくなるなどの便益は十分にあると思いました。

      5.『作ってわかる! アンサンブル学習アルゴリズム入門』(シーアンドアール研究所)

      会社で行っているPythonもくもく会用に買った本で、scikit-learnを使わずに機械学習のアルゴリズム(アンサンブル系)をコーディングするための本です。pythonのコードについて逐次、細かい解説が行われているわけではないので、1行1行自分でコメントを加えながら写経をしていけば力が付くという本かなと思われます。sklearnはそれはそれで素晴らしいですが、こういう本でフルスクラッチで修行できるのはいいですね。

      6.『数理統計学―基礎から学ぶデータ解析』(内田老鶴圃)

      統計検定1級を合格された方のブログで紹介されていた教科書です。理系の大学生レベルの数学知識があれば、数理統計学の基礎を学べると思います。中心極限定理の証明や、様々な分布の期待値や分散、様々な分布の性質について数式を用いてしっかり理解することができます。数式もほどよく端折られているので、無論ですがノートが数冊必要になります。各章毎にある練習問題も解くことで力が付くと思います。日本の大学の授業の教科書がこれだったらジェノサイド(再履修者の大量発生)が起きるんだろうなと思ってしまった。

      7.『44の例題で学ぶ統計的検定と推定の解き方』(オーム社)

      統計の検定に関してだけ扱った珍しい本です。第3部までは統計学の普通の教科書ですが、それ以降であらゆる検定の例題が44件も載せられています。パラメトリックな検定から、ノンパラメトリックな検定まで幅広く扱われています。一番気にいっているのは仮説検定法の分類の表です。これさえあれば、どのデータに対してどの検定を行えばいいかが一目瞭然です。

      8.『わけがわかる機械学習 ── 現実の問題を解くために、しくみを理解する』(技術評論社)

      機械学習の原理を手早く数式を交えて学べる本です。かゆいところに手が届いていると言うか、既出の教科書では捨象されがちな、条件付き確率における2変数以上の条件づけでの表現に紙面を割いていたりしてくれるのが嬉しいです。ある程度数学の話はわかるが、だいぶ忘れているビジネスパーソンには大変にありがたいコンテンツと言えると思います。ベイズ線形回帰に関しても行列を用いた、わかりやすい導出方法が紹介されています。またコラムで紹介されている、測度論にどう向き合えばいいかの著者の見解は参考になります。

      9.『Statistical Rethinking: A Bayesian Course with Examples in R and Stan (Chapman & Hall/CRC Texts in Statistical Science)

      R言語とstanを用いてベイズ統計学を入門レベルから学べる本です。各トピックごとにそれなりの紙面が割かれています。例題も豊富にあるので、線形回帰・MCMC・情報量基準・階層ベイズモデルまで、ベイズ統計学を基礎から応用までしっかりと学べると思います。youtubeで著者の講義も配信されているので、留学気分を味わえます。

      10.『scikit-learnとTensorFlowによる実践機械学習』(オライリージャパン)

      2019年に日本で開かれたML SummitでTFの開発者がおすすめしていた教科書です。前半部分で機械学習の入門から応用までをわかりやすい説明で学ぶことができます。数式は少ないですが、図とソースコード(Python)がちりばめられており、手を動かして理解を進めることができます。後半部分はTensorFlowを用いた深層学習の基礎を同様に手を動かして学ぶことができます。ただ、TFのバージョンも変わってきているので前半の説明をアテにして読むのも良いと思います。

      11.『AIアルゴリズムマーケティング 自動化のための機械学習/経済モデル、ベストプラクティス、アーキテクチャ (impress top gear)

      マーケティングへのデータサイエンスの適用に関する珍しい書籍です。ソースコードはついていないですが、業務で使う際のアイデアが手に入ることもあります。一般的な回帰、生存時間分析、オークション、アトリビューション分析、アップリフトモデリング以外にも、情報検索やレコメンデーションやトピックモデルなどマーケティングながら学際的なトピックも扱われています。レコメンドなどで使われる、ランク学習に関して詳しく書かれた書籍をあまり知らないので、この本はその点においてもありがたい本でもあります。

      12.『入門 統計的因果推論』(朝倉書店)

      ほぼ全ての章でグラフィカルなアプローチで因果推論を扱っています。例題も豊富なので、一つ一つ丁寧にやれば理解が捗ります。おそらく、例題の多さを含め一番丁寧にd分離性、do演算子、バックドア基準、フロントドア基準に関する説明をしてくれている本なのかなと思いました。グラフでの因果推論に関して初めての人でも、確率さえ知っていれば読み進めることができるはずです。また、途中で操作変数法の紹介もされ、経済学出身者としては読みやすい。ただ、傾向スコアのくだりや、DIDなどのくだりはあまり出てきません。あと、やってないですが章末の練習問題に対するSolution Manualが提供されているようです。

      13.『実践 ベイズモデリング -解析技法と認知モデル-』(朝倉書店)

      ベイズモデリングを様々な事例に適用する方法がオムニバス形式で記された本です。ワイブル分布や異質性を考慮した二項分布、無制限複数選択形式のアンケートデータに対する手法、トピックモデル、項目反応理論などが扱われています。マーケティングの実務で使える事例が多いように感じました。こちらはサポートサイトでRコードとstanコードが提供されています。あと、appendixにあるプレート表現の見方も参考になります。

      14.『機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書)

      機械学習などで用いるベイズ推論を扱った教科書です。入門とありますが、入門者は書かれた数式をそのまま見ていても頭に入らないのではないでしょうか。手を動かしてなんぼの本だと思います。ノート2冊は絶対に必要です。たぶん、数式の展開を丁寧に記すと倍以上の厚みの本になると思います。各々のモデルに関してグラフィカルモデルが記されているのや、サンプルコードとしてGitHubにJuliaで書かれたソースコードが提供されているのも良いです。

      15.『その問題、数理モデルが解決します』(ベレ出版)

      物語形式で、様々な問題に対して数理モデリングのアプローチが紹介されています。途中でマッチング理論やゲーム理論やオークションなども登場することから、経済学出身者も喜ぶ内容かもしれません。社会人になってからナッシュ均衡という言葉が書かれた本は中々出会って来なかった。

      16.『ヤバい予測学 ― 「何を買うか」から「いつ死ぬか」まであなたの行動はすべて読まれている』(CCCメディアハウス)

      2013年と結構古い本ですが、データ分析を様々な事象に対して適用した事例紹介本です。アップリフトモデリングへの言及もあり、こういったものに関して日本は何年も遅れてブームが来るんだなという実感を与えてくれた本でもありました。appendixに分析事例が147個ほどあげられているのも参考になります。

      17.『たのしいベイズモデリング2: 事例で拓く研究のフロンティア』(北大路書房)

      主にstanを用いたベイズモデリングによる分析事例が1と2で38本もオムニバス形式で載っています。ほとんどの事例で階層ベイズモデルが扱われています。2では若干マーケティングに近い内容の題材も扱われ、データサイエンティストの人にも嬉しい内容かもしれません。もちろんデータとstanとRのコードがサポートサイトで提供されています。

      18.『カルマンフィルタ ―Rを使った時系列予測と状態空間モデル― (統計学One Point 2)』(共立出版)

      状態空間モデルで時系列予測を行うための手法が記されている本です。RのKFASパッケージが全面に渡って扱われています。トレンドを考慮したり、カレンダー効果を追加したり、共変量を追加したりなど様々なアプローチが紹介されコードも伴っているわけですから、業務でも抜群に役に立ちました。

      19.『機械学習のエッセンス -実装しながら学ぶPython,数学,アルゴリズム- (Machine Learning)』(SBクリエイティブ)

      自分のいる会社で最低限の数学がわかると思われる若いメンバーに買ってもらうように言っている本です。微積分・線形代数だけでなく、カルシュ・キューン・タッカー条件(最適化数学)に関しても扱ってくれているので、ここで出てくる数学がわかれば大体の論文に立ち向かえると思います。さらに、Pythonの基礎もこれで学ぶことができるので一石二鳥な素敵な本ですね。また、最後の方でスクラッチでアルゴリズムを書くパートがあり、こちらも勉強になります。

      20.『機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践 (オライリー・ジャパン)』(オライリー・ジャパン)

      機械学習における前処理の指針を与えてくれる本です。Pythonのコードが提供されています。例えばですが、「テストデータにだけある、新しい単語は取り除いてしまえばいい」などの細かいアドバイスが何気に嬉しいです。「Effectコーディング」「特徴量ハッシング」「ビンカウンティング」「バックオフ」「leakage-proof統計量」などは読むまで知らないところだったので勉強になりました。

      21.『データサイエンスのための統計学入門 ―予測、分類、統計モデリング、統計的機械学習とRプログラミング』(オライリージャパン)

      データ分析の仕事をする上で最低限必要な知識を幅広く抑えることができる本です。数式は少なく、ところどころ出てくるコードはR言語です。参考文献などがブログだったりするため厳密さがめちゃあるわけではないですが、業務で使う分には問題ないと思います。分類問題において、AUCなどの評価指標だけでなく、予測値自体の探索的分析のすすめなどが書かれており、参考になりました。また、特徴量エンジンとしてのk-NN法の話も面白いと思いました。

      [+α]『プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで』(翔泳社)

      Google Cloud Platformを初めて触るデータ分析者にはちょうど良い本です。説明もわかりやすいので、いきなりアカウントを作ってドキュメントを解読するよりかは戸惑いは減るはずです。この本を土台に、GCS・GCEを駆使してML系のAPIを呼び出して使うなどの最低限の操作は私でもできるようになりました。GCPの画面や機能もどんどん変わっていくので書籍を買ってもアレなんですが、歴史的な背景も若干記述されているので、それはそれで勉強になります。ただ、エンジニアにこの本を買うべきか聞いた際にネガティブな意見があったのですが、たぶん現役プログラマからすると簡単過ぎるからなんだろうなと思います。

      終わりに

      2019年もぼちぼち勉強できましたが、2020年もこれまで同様にノートとペンを大事にする勉強を続けていき、コーディングも分析ももっともっと数をこなして会社や社会に求められるようなデータ分析官を目指していこうと思います。あぁ、英会話などの勉強をする時間を作るのが難しい。

      ABEJA SIX 2019の1日目に行ってきましたレポート

      今日は午後から有給をいただいて、ABEJA SIXの1日目に行ってきました。印象的だなと感じたものに関して、つらつらと雑記を載せておきたいと思います。


      こちらは品川グランドプリンスホテルの庭園です。


      こちらは会場の雰囲気です。


      ブースの様子1です。


      ブースの様子2です。

      ABEJA SIX 2019

      「食事画像認識モデル開発プロジェクトでの10個5個の教訓」 株式会社FiNC Technologies 南野 充則 氏

      • FiNCは450万ダウンロードされているヘルスケア系のアプリを開発している会社。
      • ユーザーの継続率を高めるための施策として、機械学習を用いている。
      • 今回の紹介事例ではユーザーの食事に関する情報を入力する手間を機械学習で短縮させ、短縮させることで継続率を高めることを狙っている。
      • 食事の画像は1日に数万枚がアプリに投稿される。
      • 食事の画像から栄養価などを計算することを目指している。
      • 食事レシピ認識モデルでは、画像からレシピを識別し、メニューの量(グラム数)なども推定し、カテゴリ単位で決まっている栄養価から推定している。レシピ本の情報を入力したり、レシピサイトをクローリングし、レシピを一人あたりの栄養価になるように標準化などもしている。きれいな画像と栄養価(材料何グラムか)の伴ったクリーンなデータセットを用意するために自社のキッチンに料理人を呼び2000レシピ分の料理を作ったとのこと。
      • 食材認識モデルでは食材一つ一つ(トマト一つとか、キャベツ一枚とか)を識別して、栄養価を素材単位で計算している。
      • 学習の結果、管理栄養士よりも3%程度の誤差でメニューの栄養価を推定可能になった。
      • 開発期間は6ヶ月間。
      • 東大の松尾研にアドバイスをもらっているらしい。

      5つの教訓

      • 1.DL/ML人材をソフトウェアエンジニアから輩出すべき
        インフラ、サーバー、DB、パフォーマンスなどに明るいソフトウェアエンジニアが機械学習や深層学習を学ぶと、分析も実装もできる頼もしいメンバーになるので、ソフトウェアエンジニアのデータサイエンティスト化に注力しているらしい。目指すは論文のリプリケーションができるレベルとのこと。
      • 2.データ取得から学習までのPDCAを最速にする
        ユーザーが画像を出したあとのフローをしっかりしていなかった。予期せぬデータが入ってくるので、そこへの対応も必要。アノテーションした項目を再学習するような仕組みを作り、そばの画像が苦手であれば、そばの画像を集中的に集めて学習させる。
      • 3.オペレーションは自社で構築せよ
        泥臭い仕事と思い、丸投げしてはいけない。データセットの質が最も大事。データセットの質を担保するには評価手法を理解し細かいオペレーションを作る必要がある。アルバイトも自社で雇用、マネジャーもエンジニアとすることで当事者意識も芽生えやすい。
      • 4.評価方法の決定からプロジェクトを始めよう
        AIを使えば、想像を超える何かが出てくると期待していまうフシがある。評価の仕方を決めたほうが、メンバーのゴールが見えるし。やりやすい。10%以内の誤差の難易度がどの程度なのかわからなかったりするし、解釈の多様性が生まれてしまうこともある。
      • 5.プロジェクトはアジャイルで進めるべき
        作ったことのないモデルを作る際にスケジューリングを引くことは難しい。SOTAくらいいけますよと言ってしまい、自らを苦しめることになりかねない。

      「機械学習におけるクラウド活用のポイント」 アマゾン ウェブ サービス ジャパン株式会社 針原 佳貴 氏 & 宇都宮 聖子 氏

      • SageMakerいいぞというお話。
      • ビジネスにおいて、機械学習を進めるに際して重要なポイントは、
        「ビジネス価値に落とし込む」
        「データの流れを理解する」
        「自分の力で頑張らない」
        の3点が挙げられていた。
      • 必要ではあるが、付加価値にはつながりにくい作業のことをUndifferentiated heavy liftingと呼ぶらしい。
      • 機械学習プロジェクトを回す際に重要なこととして、
        データ取得

        データ前処理

        モデルの開発・学習

        モデルの評価

        モデルの変換(エッジデバイスに送るにはデータを小さくする必要がある。)

        本番環境のデプロイ

        監視・評価データ変換
        のループを繰り返すことが挙げられている。
      • S3(Simple Storage Service)に蓄積しているデータがあったとして、そのデータに対して、SageMakerで前処理やら機械学習を行い、学習済みの結果をS3にためれば、それを用いてエンドポイントの推論としてカジュアルに活用することができる。S3→SageMaker→S3のコンボが良いとのこと。
      • ここ1年間で200個くらいAWSのサービスやら機能が増えているので、それを知るだけでも大変そう。でもうまく使えば、Undifferentiated heavy liftingを避けることができる。
      • わからないことがあれば、ソリューションアーキテクトに質問したり、SageMakerのSlackで聞いたりすると良いらしい。
      • SageMakerでの学習の進め方としては3種類ある。1つ目は、TensorFlowなどでゴリゴリとアルゴリズムを書く。2つ目はAWS Marketplaceで販売されているアルゴリズムを時間単位で課金して使う。3つ目はAWSのビルトインのアルゴリズム(Object Detection、Semantic Segmentation、Factorization Machineなど)を使う。

      「少数データからの学習法の展開とABEJAの取り組み」 株式会社ABEJA 藤本 敬介氏

      • データの質がモデルの結果を左右するが、きれいなデータを大量に集めるためにアノテーションをやるのは大変。少ないデータでも性能を出したい。
      • アプローチとしては、Data Augmentation、Transfer Learning、Meta learningの3つがある。

      Data Augmentation(データ拡張)

      Transfer Learning(転移学習)

      • 異なるデータセットで学習したものを再利用する。
      • Fine-tuning:別のデータで学習済みのモデルに対して、タスクに対してのデータに適用する。
      • Domain Adaptation:学習済みのモデルやデータの知識を再利用する。
      • Fine-tuningは有効な手段。

      Meta learning

      • タスクの学習のしかたを学習する
      • 少数のデータでのうまい学習方法を訓練しておいて、それを使い回す。

      ABEJAの取り組み

      • データが少ない場合はFine-tuningで高精度を出しやすい。
      • External Network:中間層の情報を利用して、例外的な処理(ネットワークにバイパスみたいなものを通す)をすることで、Fine-tuningした際に精度が落ちないようにしている。不均衡データやクラス追加に対して強い手法とされている。データ数に応じてExternal Networkのサイズを調整でき、クラス1に大量のデータがある場合、1だけネットワークを深くして、2やら3はネットワークを浅くするなどの柔軟な対応が可能。これでもって不均衡データに対応できるとのこと。また、クラス追加に関しては、追加したクラスの分だけ学習すればいいようにネットワークの学習ができるらしい。ただし、学習に時間がかかるとのこと。
      • (よくわからないが)Model-Agnostic Meta-Learning(MAML(マムル))を応用したら精度が高まるらしい。

      うーん、DNNは全然追いかけれていないので断片的にしかわからなかった。悔しいものです。

      「Deep Learningの都市伝説と現実」 株式会社ABEJA 白川 達也氏

      • リサーチャーをする上で大事なこととしては、
        1.先に見つけること
        2.シンプルに解くこと
        3.先に失敗する(大きな失敗は会社としてしないために)
        の3つがある。
      • クリーンなデータで学習したほうが精度が高くなりやすく、過学習しにくい。ラベルの精度が高ければ、高いほどよい。Big Clean Data + DLで勝つる?
      • アノテーションは簡単ではない。アノテーターごとにわかりやすい情報がバラバラで、ブレるのが本質的。どこまでやるのか、どこが基準なのかというフレーミングとアンカーリングが重要。人間とかタスクを理解してすすめるのが良い。
      • 半教師あり学習(アノテーションされていないデータを使って精度向上させる取り組み)も魅力的だが、教師データを増やしたほうが効率的。アノテーションできるならば、アノテーションしてしまおう。事前学習も意味があるので行う。
      • 次にどんな技術がくるのか? Graph Convolution、Annotation、Poincare Embeddings、ML in Hyperbolic Space
      • Taskonomyという研究が今後熱くなるかも。見たこともないタスクも解けるという柔軟性を持つモデルが構築できる?

      感想

      機械学習で精度を出すためにそこまで頑張るのか!という事例を聞けたり、知識として不足していたAWS系のサービスの話を聞けたり、自分の足りていない知識を補えた良いイベントだと思いました。

      Word2Vecを用いて蒙古タンメン中本の口コミ評価を予測してみる

      はじめに

      word2vecを用いた分類は以前からやってみたいと思っていたのですが、関心を持てるテキストデータがなかったのでなかなか手を出していませんでした。
      ある時、ふとしたことから某グルメ系口コミサイトから蒙古タンメン中本の口コミと評価点を抽出して、その評価をword2vecでやってみるのは面白いだろうと思いついたので、さっそくやってみます。
      こういう時にはじめて、データ分析だけでなくクローリング屋としても業務をやっていて良かったなと思うところですね。
      コードは以前見つけて紹介した「分散表現を特徴量として文書分類するための方法について調べてみた」のものを再利用します。

      目次

      ・目的
      ・データ収集
      ・形態素解析
      ・集計
      ・分散表現とは
      ・word2vecについて
      ・gensimのword2vecの引数
      ・word2vecによる文書分類の適用
      ・終わりに
      ・参考情報

      目的

      某グルメ系口コミサイトの口コミを収集し、個々人の口コミの内容から個々人の店に対する評価が高いか低いかを予測する。

      データ収集

      BeautifulSoupで収集しており、各店舗あわせて数千件ほど集めました。(実行コードはこちらでは紹介しません。)

      このようなデータが手に入っている前提で以下の分析を進めていきます。

      形態素解析

      文書を形態素解析して、名詞のみを抽出するためのコードを用意します。

      先ほどのデータフレームに対して以下のように実行すれば、名詞のみの分かち書きを行ったカラムが手に入ります。

      集計

      点数のヒストグラム

      3.5点から4点の間が最も評価が多いようです。1点台をつける人はほとんどいないことがわかります。

      単語数のヒストグラム

      大体の口コミで100単語未満のようです。

      単語数と点数の散布図

      どうやら口コミにおいて500語を超える記述をしている人は評価が3点を下回ることはないようですが、文字数と点数でキレイに傾向が出ているわけではないですね。

      形態素解析結果の集計、単語ランキング

      名詞の抽出に関して非常に便利なMeCab Neologdを用いています。蒙古タンメンもきちんと捉えることができています。

      味噌よりも北極の方が出現しているようです。北極は言わずもがな、極端に辛い罰ゲームレベルの一品。味噌タンメンは辛さが抑えめのラーメンで、知人の間では最もおいしいのがこのレベルだという合意があったりしますね。

      分散表現とは

      • 単語の意味を低次元の密な実数値ベクトルで表現したもの。
      • 入力層から中間層への重み自体が各単語の分散表現となっている。
      • 2017年9月のテキストアナリティクスシンポジウムにてメルカリとGunosyが特徴量として分散表現を活用しており性能が出ているとの発言があった。

      word2vecについて

      単語の分散表現を作ることを目的としている。

      • CBOW(Continuous Bag-of-Words)
        注目している単語の前後N単語を文脈と呼び、その文脈をBag-of-Words表現として入力し、注目している単語を出力するというニューラルネットワークを学習する。入力層から隠れ層への結合は単語の位置を問わず同じとし、隠れ層の活性化関数をただの恒等関数としている。
      • Skip-gram
        文脈のBOWを突っ込むCBOWとは異なり、入力層に1単語だけを入れる。1単語を入力し、正解データとして他の単語を入れることを繰り返して学習し、ある単語の入力に対して、どの単語の出現確率が高いかどうかを計算する。正解確率が上がるようにニューラルネットワークの重みを調整する。深層学習で使われる自己符号化器と似たような構造とされている。

      gensimのword2vecの引数

      gensimのword2vecには数多くの引数が存在します。gensimのドキュメントに英語で書かれていますが、せっかくなのでこちらで紹介します。

      • sentences
        解析に使う1行1センテンスで書かれた文書。日本語の場合はLineSentenceフォーマットを使えばうまくいった。単語が空白文字で区切られていて、文章は改行で区切られていれば問題ない。
      • sg
        {1,0}の整数で訓練アルゴリズムを設定できる。 1を選べばskip-gramで、0ならばCBOWを使う。
      • size
        特徴ベクトルの次元を設定する。
      • window
        文書内における現在の単語と予測した単語の間の距離の最大値を設定する。言い換えると、文脈の最大単語数を設定する。
      • alpha
        学習率の初期値を設定する。
      • min_alpha
        訓練の過程で徐々に落ちていく学習率の最小値を設定する。
      • seed
        乱数を生成する際のシード番号を設定する。
      • min_count
        一定の頻度以下の単語を除外する際の値を設定する。
      • max_vocab_size
        語彙ベクトルを構築している際のメモリ制限を設定する。
      • sample
        (0, 1e-5)の範囲で、頻度語がランダムに削除される閾値を設定する。高速化と精度向上を狙っており、自然言語処理においても高頻度語はストップワードとして除去するなどの対応が取られている。
      • workers
        モデルを訓練するために多くのワーカースレッドを利用するかどうか設定する。(並列化関連)
      • hs
        {1,0}の整数で、1であれば階層的ソフトマックスがモデルの訓練で用いられ、0であり引数negativeがnon-zeroであればネガティヴサンプリングが設定できる。全部計算することが大変なので、階層的なグループに分けて各グループごとに学習するというのがモチベーション。
      • negative
        0よりも大きければネガティブサンプリングが用いられる。5〜20などを選び、どれだけノイズワードが描かれているかを識別する。0であればネガティブサンプリングが適用されない。ネガティブサンプリングは計算高速化を目的に出力層で正解ニューロン以外のニューロンを更新しないように学習する手法。
      • cbow_mean
        {1,0}の整数で、0であれば単語ベクトルの合計を用い、1であればCBOWが用いられた際の平均が用いられる。
      • hashfxn
        訓練の再現性のためにランダムに初期値のウエイト付けできる。
      • iter
        コーパスにおける繰り返し回数(エポック数)を設定できる。
      • trim_rule
        ある単語を語彙に含めるべきかどうかを識別する、語彙のトリミングルールを設定する。
      • sorted_vocab
        {1,0}の整数で、1であれば頻度の降順で語彙を並べ替える。
      • batch_words
        ワーカースレッドにわたすバッチの大きさを指定する。(並列化関連)
      • compute_loss
        Trueであれば損失関数の計算と蓄積を行う。
      • callbacks
        訓練時の特定の段階で実行する際に必要なコールバックのリストを指定できる。

      word2vecによる文書分類の適用

      口コミの点数が4点以上であれば1、そうでなければ0を取る変数を作成し、それをラベルとして文書分類を行います。
      以前、紹介したブログ同様に、scikit-learnのExtraTreesClassifierを用いてCountVectorizerとTfidfVectorizerを特徴量としたものをベースラインとして、同様の手法に対してword2vecで作成した分散表現を特徴量として用いたものとを比較します。評価指標はクロスバリデーションスコア(5-folds)とします。

      分類の前に、せっかくword2vecを使ったので、任意の単語に類似した単語を見てみます。

      まずは初心者向けの味噌ラーメン

      続いて、中級者向けの蒙古タンメン

      そして、上級者向けの北極ラーメン

      最後に、誰もが経験する翌日という単語。

      どれも関連性の高いと思われる単語が抽出できているように思われます。

      それでは分類モデルの学習を以下のコードで行います。
      scikit-learnを使えば、データさえあれば非常に短いコードで書けてしまいます。

      一応、ベースラインよりもword2vecを特徴量としたものの方がスコアが高いのですが、わずかです。TF-IDFベースで特徴量を作成したモデルは十分に性能が出ているようです。
      word2vecを用いることによる旨味はそれほどなさそうですが、パラメータを試行錯誤していけばよくなるかもしれません。

      終わりに

      蒙古タンメン中本のテキストをWebスクレイピングし、その口コミ情報をコーパスとして口コミ評価の二値分類に挑戦しましたが、TF-IDFよりもわずかに優秀な特徴量になりうるという結果になりました。もっと劇的な向上を夢見ていたのですが、パラメータの試行錯誤を今後の宿題としようと思います。

      参考情報

      Chainer v2による実践深層学習
      word2vecによる自然言語処理
      models.word2vec – Deep learning with word2vec
      Python で「老人と海」を word2vec する
      Python3 – MeCabで日本語文字列の名詞出現数の出し方について
      Transform a Counter object into a Pandas DataFrame

      深層学習のマーケティング適用事例をarXivから漁る

      はじめに

      深層学習が流行りだして久しいですが、マーケティングにおいて適用することが全くないため、学習のモチベーションを維持する事ができておりません。そろそろアカデミアの領域でマーケティング事例での深層学習の盛り上がりがあるのではないかと期待して、調べてみようと思います。

      基本的に各研究ごとに
      ・目的と結果
      ・対象となるデータ
      ・手法の概要
      ・PDFのリンク
      について記していきます。リンクは下の方にある参考情報を参照ください。

      調べ方

      いったん、皆さんの大好きなarXiv.orgに掲載されている論文の中から、マーケティングに関わりそうなものを見つけます。見つけ方としては、Google検索において、「marketing deep learning site:https://arxiv.org」するものとします。site:コマンドを使うことでarXiv.org以外の情報を弾いて検索できます。

      今回紹介する研究

      • Predicting online user behaviour using deep learning algorithms
      • Churn analysis using deep convolutional neural networks and autoencoders
      • Customer Lifetime Value Prediction Using Embeddings

      Predicting online user behaviour using deep learning algorithms

      目的と結果

      大規模ECサイトのユーザー行動からの24時間以内での購買意図の予測を目的としており、ベースラインである既存の手法と比べて、深層学習の手法(Deep Belief Networks・Stacked Denoising auto-Encoders)が予測において勝り、不均衡データの分類においても秀でているという結果となった。

      対象となるデータ

      • 6ヶ月間のECサイトのユーザー行動データ
        • ユーザーID

        • タイムスタンプ

        • イベントタイプ

          • 商品のPageView(価格などの詳細データが伴う。商品数は25,000個)
          • カゴのPageView(価格などの詳細データが伴う。)
          • 購入
          • 広告クリック(今回の分析では無視)
          • 広告ビュー(今回の分析では無視)

      手法の概要

      • 前処理
        ・購入までのセッション期間
        ・ユーザーごとの購入に対するクリックの比率
        ・購入までのセッション数の中央値
        ・商品の説明文
        ・商品の価格
        ・商品に費やされたセッション時間の合計
        ・セッションが発生した時刻
        ・セッション単位でのクリック数
        ・セッション単位での購入した商品の平均価格
        ・過去24時間でのページビュー数
        ・先週のページビュー数

        • 購入アイテムの説明文に対して、word2vecにより50次元の分散表現を作成しその算術平均をとった。
        • サイトにおいてクリック数が10回以下のユーザーのデータを除外。
        • 特徴量の次元圧縮のためにNMF(Non-Negative Matrix Factorization)を適用。
      • アルゴリズム(評価方法はAUC、10分割交差検証。Kerasで実行。)
        • Deep Belief Networks
          2006年にHintonが提案した教師なし学習アルゴリズム。制約付きボルツマンマシン(RBM)を多数重ねて、最上位層だけ無向でそれ以外は下層への有向エッジを伴うネットワーク。
          RBMよりも複雑なデータ生成の仕組みをモデル化することができるとされている。
        • Stacked Denoising auto-Encoders
          AutoEncoderは出力データが入力データをそのまま再現するニューラルネットワークで、入力層から中間層への変換器をencoder、中間層から出力層への変換器をdecoderと呼ぶ。
          そのAutoEncoderを高次元に写像できるように改良したものがDenoising auto-Encodersと言われています。
          さらに、そのDenoising auto-Encodersを層ごとに学習し積み重ねて教師ありの学習器を繋いだものをStacked Denoising auto-Encodersと呼びます。
        • 決定木
        • ランダムフォレスト
        • Drop outによる正則化
          過学習を避けるために、ランダムに隠れ層や入力層を除いている。

      PDFのリンク

      Predicting online user behaviour using deep learning algorithms

      Churn analysis using deep convolutional neural networks and autoencoders

      目的と結果

      電話通信業におけるユーザーの解約予測を行うことを目的とし、深層学習を用いた予測の結果、既存手法よりも精度が高いことがわかった。
      また、解約予測だけでなく、解約理由を探るに際しての可視化においてもAutoencoderを用いることで理解が深まることが示されている。

      対象となるデータ

      • ユーザー情報(おそらく携帯電話会社であるタイのトゥルー・コーポレーションのデータ)
        • データ使用量
          モバイルのプリペイド補充金額
          モバイルのプリペイド補充頻度
          音声通話
          通話時間
          SMSメッセージ
          など

      手法の概要

      • ユーザーの情報を画像のように扱う。各々の行が日にちを表し、各々の列がユーザー行動の種類を表す。
      • 二値変数の定義
        解約の定義は30日間行動が観察されなかったかどうか。(解約率は3.57%)
        最後の通話は過去14日間での通話として、最後の14日間に記録のなかったユーザーは分析対象から除外している。プロアクティブな解約予測をするに祭して、すでに解約してしまったと思われる人を除外するということとなる。
      • ユーザー行動を画像のように変換したデータに対してCNN(Convolutional Neural Network)を実行しています。
        CNNの構成としては、
        ・2連続のConvolutional Layer
        ・2×1の最大Pooling Layer
        ・128個のFully Connected Layer
        ・バイナリーな結果を返すsoftmax output
        となっています。
      • 訓練データとテストデータは80:20で分割
      • Docker上で環境を構築
      • オープンソースライブラリとしてはTheano、TensorFlow、Kerasを利用。
      • ユーザー理解のためにAutoencoderを適用している。

      PDFのリンク

      Churn analysis using deep convolutional neural networks and autoencoders

      Customer Lifetime Value Prediction Using Embeddings

      目的と結果

      手探りで特徴量を構築してきた、既存のCustomer Lifetime Value(CLTV)の算出手法に勝るモデルを作ることを目的とし、十分なデータがあれば、既存の特徴量よりも予測パフォーマンスにおいて秀でていることが示されている。しかしながら、ランダムフォレストを超えるレベルの精度を追求するとニューロンの数を大幅に増やす必要があり、計算コストがかかるため商業的なバリューにおいて懸念がある。

      対象となるデータ

      • ユーザー情報(アパレルECサイトのASOS.comのデータ)
        注文数
        注文日の標準偏差
        直近四半期のセッション数
        売り上げ
        など

      手法の概要

      • 特徴量の生成
        word2vecを行うに際して、単語の代わりとしてユーザーの商品ビューデータを入力としてニューラルネットワークによる分散表現の生成を行なっている。出力層において、全てのユーザーへのノードがあり、ユーザー数が1億人近くいるため計算が膨大になってしまうが、Negative Sampling(NE)によるSkipGramを行うことで、計算の高速化(近似による計算コストの低減)が図られている。分散表現の次元は32-128次元までが望ましい傾向を示している。
      • Hybridモデルの適用
        既存の特徴量に分散表現を加えた、ロジスティック回帰とのHybridなDNNによるモデルの適用を行なっている。
      • CLTVの研究ながらも、予測し検証する目的変数は解約(12ヶ月購買なし)の有無。
      • 検証用のデータは5万人のユーザーデータ
      • ベースラインとの比較となる評価指標はAUCが使われている。ベースラインはロジスティック回帰とランダムフォレスト。
      • オープンソースライブラリとしてはTensorFlowを利用。GPUはTesla K80を利用。

      PDFのリンク

      Customer Lifetime Value Prediction Using Embeddings

      まとめ

      • ユーザーの行動ログに対して、縦を時間、横にカテゴリとして画像データのように扱うアプローチを知れた。
      • データ数が十分に多そうな企業の適用例が多かったが、扱うデータの規模感が少しわかった。
      • 画像や音声ではなく、ユーザーデータにおいてもDNNでランダムフォレストを超える精度を叩き出せる可能性はあるが、計算コストがかかってしまい商業的なバリューが下がってしまう可能性もある。
      • ログや閲覧したページのコンテンツベースに生成した分散表現を特徴量とするアプローチが3例中、2例あった。

      データ量の観点からまだまだ社内での適用は視野に入っていないですが、私のDNN理解も浅いので、今回のような分析事例をモチベーションにして勉強を進め適用可能性を探っていきたいと思います。

      参考情報

      Chainer v2による実践深層学習
      深層学習 (機械学習プロフェッショナルシリーズ)
      Stacked Denoising Autoencoderを用いた語義判別
      Dropoutの実装と重みの正則化
      RBMから考えるDeep Learning ~黒魔術を添えて~
      Convolutional Neural Networkとは何なのか

      人工知能学会全国大会2017のWebマーケティングで参考になりそうな研究9選

      はじめに

      今更ではありますが、2017年5月に開かれた人工知能学会全国大会2017の公開資料の中から、私の本業であるWebマーケティングで役に立ちそうな研究を独断と偏見で9本ほど集めてみました。思っていたよりもWebマーケティングぽい領域が多かったので、社内での分析業務におけるアイデアに直結しそうな気がしています。

      ちなみに、全ての資料はこちらにあります。

      基本的に各研究ごとに
      ・目的と結果
      ・対象となるデータ
      ・手法の概要
      ・PDFのリンク
      について記していきます。

      紹介する研究

      今回は以下の研究を紹介したいと思います。
      「オンライン広告におけるスパース性と遅れコンバージョンを考慮した予測モデル」
      「テキストマイニングを用いた転職サイトの会員離脱予測」
      「インターネット広告におけるスパースなユーザー行動ベクトルからのユーザー特徴抽出モデル」
      「ユーザーのページビュー系列からのコンバージョン予測」
      「SNSにおけるユーザの行動のモチベーション要因の分析」
      「状況に応じた楽曲推薦に向けたソーシャルデータ分析」
      「テキストマイニングを用いた口コミ分析による点数評価の信頼性確認手法」
      「不動産仲介マーケティングのためのユーザ行動予測」
      「SUUMOでの不動産データ活用の取り組みと未来」

      オンライン広告におけるスパース性と遅れコンバージョンを考慮した予測モデル

      目的と結果

      オンライン広告のCVR予測の精度向上を目的としている。
      これまでの課題としては、
      「質的変数による特徴量のスパース性」
      「広告クリックからのCVまでの期間の長さ(期間が空いてからCVしたりするケースがあるので正例だったはずが負例と扱われる可能性がある)」
      などがあった。提案手法により従来手法に比べ高い精度でCVR予測が可能であることが示された。

      対象となるデータ

      過去3週間分の広告配信データでテスト期間は7日間

      手法の概要

      • 次元圧縮
        • Factorization Machine(FM)を用いて、従来のロジスティック回帰では考慮できていなかった交互作用をモデリングし、低次元のベクトル内積に分解して表現している。
      • 遅れCV問題の対応
        • 遅れてCVが発生する事象に関しては、指数分布を用いて遅れてCVする事象をモデリングするDelayed Feedback Modelを構築することで、本当は事後的にCVしそうなユーザーの推定を行っている。
      • 予測
        • これらの手法を合わせた、Delayed Feedback Factorization Machineを構築し、SGD(確率的勾配降下法)やAdaGradを用いてパラメータを推定している。

      PDFのリンク

      https://kaigi.org/jsai/webprogram/2017/pdf/110.pdf

      テキストマイニングを用いた転職サイトの会員離脱予測

      目的と結果

      登録情報や履歴書のテキスト情報を用いて特徴量とし、転職サイトの登録会員の離脱予測を行っている。ブラックボックスでは無い形での結果の解釈ができ、予測精度も高いことが示された。

      対象となるデータ

      • 2009年10月1日〜2016年9月28日までの履歴書、職務経歴書、自己PR書、希望条件
      • 離脱会員の定義は「登録して1ヶ月以内に一度も応募しない会員」としている。

      手法の概要

      • STEP1:Pythonのmojimojiというライブラリを利用してカナを全角に、数字とアルファベットは半角に変換。
      • STEP2:MeCabを用いて名詞のみ抽出
      • STEP3:「職務」「経歴」「業務」「内容」などを不用語(stop word)とした。
      • STEP4:Grid Searchでパラメータチューニングしたランダムフォレストを用いて変数重要度(Feature Importance)を出し、重要度の上位90%を占める単語以外を削除
      • STEP5:登録情報のデータ(年齢、転職回数、住所)を数値データに変換
      • STEP6:選定した特徴量を用いて決定木アルゴリズムを適用

      PDFのリンク

      https://kaigi.org/jsai/webprogram/2017/pdf/949.pdf

      インターネット広告におけるスパースなユーザー行動ベクトルからのユーザー特徴抽出モデル

      目的と結果

      広告のCTR予測を行う際の特徴量が非常にスパースであることから、ユーザーをクラスタリングして広告配信に効果的なユーザーを抽出することを目的としている。研究ではCVRの高いユーザー群の抽出を可能にしている。

      対象となるデータ

      • 2016年6月1日〜2016年6月21日の間のクリックやコンバージョンのデータ(株式会社アイモバイルが提供)
      • クリック実績のある広告数、コンバージョン実績のある広告数、クリックされた広告番号、コンバージョンが発生した広告番号、ユーザー番号など

      手法の概要

      • 高次元スパースデータを低次元に落とし込むために、オートエンコーダを用いている。
      • オートエンコーダにより得られた特徴量をもとにユーザーのクラスタリングを行っている。(オートエンコーダは入力された情報をなるべく欠損しないように、効率的に圧縮する構造を持たせたニューラルネットワークのこと。)
      • データにおけるゼロの成分を確率的に欠損とみなして計算処理を早めている。
      • 学習モデルはAdaGrad(学習率を学習に合わせて最適化する手法)
      • 訓練データ(特徴量の数がクリックで23339個、コンバージョンで5619個)にスパースデータ許容型オートエンコーダで500次元まで圧縮し、さらに通常のオートエンコーダで146次元まで圧縮している。
      • 次元圧縮して獲得したデータに対してk-means法でクラスタリングを行い、CVRなどを比較している。

      PDFのリンク

      https://kaigi.org/jsai/webprogram/2017/pdf/12.pdf

      ユーザーのページビュー系列からのコンバージョン予測

      目的と結果

      Web広告において、ユーザーの閲覧履歴からコンバージョンを予測することを目的に、Recurrent Neural Network(RNN)を用いた結果、非時系列のSVMよりもわずかばかりかの精度向上が観察された。データ数が少ない場合はSVMに軍配があがる結果となっている。

      対象となるデータ

      2016年7月1日〜2016年10月31日の広告の接触履歴データなど(広告の業種別データやユーザーのページビュー数)を特徴量に用いて、2016年11月1日〜11月30日までの期間を予測対象とした。データは株式会社マイクロアドが提供している模様。

      手法の概要

      • Long Short-Term Memory RNN(LSTM)
        • ソフトアテンションモデル
          • 可変長の系列に対して内積で重みを算出し、足し合わせることで一部から情報を取り出すモデル。途中の層まで複数業種のデータを用いることで、複数の業種などの情報を共有することができる。(最後の隠れ層には業種別の特徴量を用いている。)
          • 勾配の計算に関してはAdamを用いて、実装はKerasを用いている。活性化関数はTanh、ドロップアウトはGaussianDropout
            としている。
        • RNNで用いる特徴量としては、特定のWebページを640種類に分類して、1日のうちに各トピックにページビューがあったかなかったかを1-0の変数にするなどの前処理を行っている。

      PDFのリンク

      https://kaigi.org/jsai/webprogram/2017/pdf/765.pdf

      SNSにおけるユーザの行動のモチベーション要因の分析

      目的と結果

      SNSユーザーのモチベーションの要因(一ヶ月先に投稿するかどうか)をユーザー同士の関係性(staticな関係)と、そのユーザーの周りのインタラクション(dynamicな関係)という観点から分析し、ユーザー同士の関係性とユーザー周りのインタラクションを同時に用いたモデルにおいて、それらがモチベーションの要因につながりうる傾向が観察された。

      対象となるデータ

      • RoomClipという部屋の家具やインテリアの様子の写真を投稿するSNSのデータ
        • 気に入った写真に「いいね」を付けたり、コメントを送れる。
      • 2015年3月の一ヶ月間を学習期間とし、2015年4月の投稿の有無を予測対象とする。

      手法の概要

      • ネットワーク特徴量
        • 各ユーザーに対して、
          • 中心性(次数中心性、媒介中心性、近接中心性)
          • クラスタ係数、PageRank、フォロー数とフォロワー数の比率、フォローしているユーザのアクティブ度
      • フィードバック特徴量
        • 特定期間中にユーザが周りのユーザから自身の投稿に対してもらった「いいね」「コメント」に対して
          • 反応の数
          • 反応を行ったユーザの数
          • 反応を行ったユーザのうち、相互フォロー関係にあるユーザからのものの割合
      • 予測器としてSVMを利用

      PDFのリンク

      https://kaigi.org/jsai/webprogram/2017/pdf/534.pdf

      状況に応じた楽曲推薦に向けたソーシャルデータ分析

      目的と結果

      ユーザへの楽曲推薦システムの構築を目的に、楽曲とその再生時の状況の関係を収集したソーシャルデータより分析している。取得したデータのうちの7%ほどではあるが、ツィート情報から楽曲と再生時の状況との関係を抽出可能であるということが示された。

      対象となるデータ

      2016年8月10日〜2016年9月3日の間に投稿されたツィート(66879件)

      手法の概要

      • ハッシュタグ#nowplaying付きのツィートを収集して、アーティスト名や楽曲名や楽曲再生時の状況(同一ユーザの5分前後の投稿内容)を収集
      • 取得したツィートからアーティスト名、楽曲名を除去して再生時の状況を取得
      • 取得したデータからデータベースを作成

      PDFのリンク

      https://kaigi.org/jsai/webprogram/2017/pdf/102.pdf

      テキストマイニングを用いた口コミ分析による点数評価の信頼性確認手法

      目的と結果

      製品などの口コミの評価レビューに関する信頼性を確かめることを目的としている。レビューデータに対して感性評価を行い、さらにその結果に対して総合評価点数別に感性表現(Goodなど)の伴った表現の頻出ランキングを作成することで、点数が高い理由を把握しやすくなった。

      対象となるデータ

      ソニーの製品サイトにおける、ユーザの製品に対する評価とコメントのデータ(1406件)

      手法の概要

      • テキストマイニングスタジオによる感性評価(ポジティブ、中立、ネガティブ)
      • 総合評価点数別(5段階)の「ポジティブ、中立、ネガティブ」の割合の調査
      • 総合評価4の口コミかつ中立な表現にフィルターをかけて、感性情報を有する単語と係り受け関係となった単語の頻度ランキングのTOP10を抽出

      PDFのリンク

      https://kaigi.org/jsai/webprogram/2017/pdf/1115.pdf

      不動産仲介マーケティングのためのユーザ行動予測 Prediction of user behaviors for real estate brokerage marketing

      目的と結果

      不動産紹介業において、顧客の属性情報と来店初期の行動から、来店者が最終的に商品を購買するかどうかの予測モデル(不均衡データにおける予測タスク)を構築することでマーケティングの広告効果測定に適用することを目的としている。結果として、顧客の来店後30分間という短い時間における行動だけでも識別力のある予測が可能であることが示されている。

      対象となるデータ

      • オンライン不動産賃貸仲介店舗iettyの顧客データベース
        • 希望物件の情報
          • 引っ越し希望日
          • 住みたいエリアの駅
          • 間取り
          • 広さ
          • 家賃
        • 顧客属性
          • 在住の地域
          • 性別
          • 年齢
        • 行動データ
          • 登録時
            • フォームの記入にかかった時間
            • フリーコメントの長さ
            • 利用デバイス
          • 登録後
            • 初回チャット発言までの経過時間
            • 初回物件評価までの経過時間

      手法の概要

      • STEP1:顧客の属性および登録初期(30分以内)の行動から特徴量を作成し、2ヶ月以内に契約すれば正例、それ以外を負例とする。(正例は619件、負例は33212件)
      • STEP2:検証用データを無作為に20%取り置く
      • STEP3:残り80%のデータに対して負例に対する、ランダムアンダーサンプリングと、正例に対するSMOTE(Synthetic Minority Over-sampling Technique)を用いたオーバーサンプリングによりサンプル数を調整する。
      • STEP4:ランダムフォレストを用いて、無効な特徴量の取捨選択や離散化のレンジ調整する。
      • STEP5:全特徴量(83次元)を二値化して、RBFカーネル(Gaussian カーネル)のSVMを適用し、様々なCやγの組み合わせを試行して、二値分類を行う。
      • STEP6:評価を予測確率の平均とAUCの2種類で行う。

      PDFのリンク

      https://kaigi.org/jsai/webprogram/2017/pdf/466.pdf

      SUUMOでの不動産データ活用の取り組みと未来

      目的と結果

      物件検索ユーザーが比較検討を行いやすくすることを目的に様々な取り組みをしている。

      対象となるデータ

      • 不動産ポータルサイトSUUMOのデータ
        • 行動履歴(Webサイト、アプリ)
        • 物件情報(不動産情報)
        • 街情報(独自で収集)
        • アンケート

      手法の概要

      • 実活用
        • 相場推定
        • 単純な加算平均ではなく、外れ値や時系列変動、データ量などを考慮して推定している。
        • リアルタイム物件レコメンド
        • ランキング学習により推定したモデルを利用し、リアルタイムに計算を行っている。個人ごとにパーソナライズしたランキングも用いている。
        • バンディットアルゴリズムによる配信施策の最適化
        • メールやプッシュ通知などで件名やデザイン、配信時間など様々な選択肢があり、その最適なパターンを見つけるために、バンディットアルゴリズムを適用している。
      • 実験段階
        • 間取り画像の分析
        • ユーザーの求めている間取りが何なのかを画像から抽出しようとしている。
        • ユーザーの検索行動、嗜好の推定
        • ユーザーの検索行動から、嗜好性を掴み取り、レコメンドする際の理由付けができるようにモデルを作ろうとしている。

      PDFのリンク

      https://kaigi.org/jsai/webprogram/2017/pdf/743.pdf

      感想

      • 特徴量の削減のためにランダムフォレストを適用する流れ
      • 高次元スパースデータに対するニューラルネットワークの適用
      • CVの時系列予測のためにRNNの適用
      • SNS分析におけるネットワーク特徴量とフィードバック特徴量という概念
      • 口コミデータ分析の作法(点数別に感性表現の係り受けを見る)
        など勉強になりました。Kaggleと違って日本語なのが読みやすかったですね。

      参考文献

      初めてのディープラーニング –オープンソース”Caffe”による演習付き
      SMOTE で不均衡データの分類