読んだ本紹介コーナー:『大規模言語モデル入門』の感想

今年の私の中でのベスト専門書オブザイヤーな書籍、『大規模言語モデル入門』について感想を述べたり、この本の魅力を伝えて布教活動をしていきたいと思い、久しぶりにブログを書こうと思います。

対象読者のイメージ

データサイエンティストとして働いている人やそれを専門にしている学生で、原理まで詳しく知りたい奇特な人が対象読者かなと思います。全国民レベルでChat-GPTが話題になった昨今、大規模言語モデルをただ使うだけでなく、仕組みや開発までの変遷などを詳しく知りたいかたにちょうど良い本です。Chat-GPTが登場して話題になった時期よりも以前に書籍の執筆を着手していると思われるので、Chat-GPTのことだけに興味がある人はそんなに満足しないのではないでしょうか。そもそもアルゴリズム自体は公開されてないですし、そういったものは書籍に求めるものではないでしょうが。

良いと思ったポイントについて

・Transformerの説明がわかりやすい
・Chat-GPTについて理解が深まるプロンプトによる言語モデルの制御について記されている
・感情分析、質問応答、固有表現抽出、要約生成、類似文書検索などの実装例が紹介されており、実務で使えそう
・個々の実装例についてファインチューニングについての記述がある
・個々の実装例についてエラー分析の記述がある
・Google Colabでも頑張れるように限られたメモリでの作法が記されている
・性能アップの強い味方であるアノテーションツールの紹介がある
・文書要約技術の概要が簡潔にまとまっている、性能指標についてもわかりやすい
・Chat-GPT APIの料金見積もりを試せるスクリプトが載っている
・外部の情報を大規模言語モデルで取り込み、その結果をChat-GPTに選ばさせるというアプリケーションの事例が載っている

Transformerの説明がわかりやすい

余談ですが、先日私の親に、「Chat-GPT」って何?と聞かれたのですが、T、つまりTransformerの説明が一番大変でした。自分が完全に的を得た説明ができているか不安だったのですが、この書籍の説明はすごくわかりやすく、自分が説明した内容と大きな相違がなかったので安心しました。

Chat-GPTについて理解が深まるプロンプトによる言語モデルの制御について記されている

zero-shot、one-shot、few-shotなどの説明から、chain-of-thought推論などプロンプトエンジニアリングについてわかりやすく解説されています。また、人間によるフィードバックのデータに関する強化学習についても記述されており、Chat-GPTの仕組みを知ることに一歩近づけます。

感情分析、質問応答、固有表現抽出、要約生成、類似文書検索などの実装例が紹介されており、実務で使えそう

大規模言語モデルを一般的な事業会社のデータサイエンティストが業務で使うとなると、類似文書検索や感情分析、固有表現抽出は使うイメージが湧きやすいです。そのため、この書籍は仕事で隣に置いておきたいと思いました。

個々の実装例についてファインチューニングについての記述がある

ゼロからモデルを訓練して学習するのは現実的ではない事業会社がほとんどだと思いますので、ファインチューニングという記載があるとグッときます。

個々の実装例についてエラー分析の記述がある

これまでの書籍でエラー分析について記されたものは中々なかった気がします。実務では必ず通る道ですので、「わかってらっしゃる」という気持ちでした。こういう実務で大事にしていることを書籍でしっかり記してもらえると、布教もしやすいので良いです。

Google Colabでも頑張れるように限られたメモリでの作法が記されている

多くの個人、事業会社がColab乞食をしていると思います。Colabの無料GPUはベーシックインカムなのではないかと思うくらいです。そのColabでも動かせるように思いやりのあるメモリ削減技術について紙面が割かれています。

性能アップの強い味方であるアノテーションツールの紹介がある

Label Studioというオープンソースのアノテーションツールの使い方について記されていました。このツールは知らなかったので、大変勉強になります。実務でアノテーションする機会は当然あって、3万件くらい一人でやったこともあります。。。

文書要約技術の概要が簡潔にまとまっている、性能指標についてもわかりやすい

文書要約自体をあまり業務で使うことがなかったので、無知だったのですが色々な要約の種類があったり、評価指標があって目から鱗でした。

Chat-GPT APIの料金見積もりを試せるスクリプトが載っている

クラウド破産にならないためにも重要な観点ですね!会社で稟議をあげて、ドキドキしながら使っている人がほとんどだと思うので、しっかり見積もっていきたいですね。

外部の情報を大規模言語モデルで取り込み、その結果をChat-GPTに選ばさせるというアプリケーションの事例が載っている

最後の章でChat-GPTと別の大規模言語モデルの合わせ技についての実装例が載っています。これは仕事で使えるかもと思える実装例だったので、色々やってみると思います。外部の情報(自社にしかない情報)を用いたChat-GPTならいろんな可能性が広がりますね。データ抜かれる可能性はゼロではないですが。

おわりに

大規模言語モデルの開発の流れやモデルを改良するためのテクニックについて十分な紙面が割かれていて、仕事で使える本だなと思いました。
あと、先日買ったライト目な本として、『大規模言語モデルは新たな知能か――ChatGPTが変えた世界 (岩波科学ライブラリー)』も良かったです。大規模言語モデルを開発した人間に関してもフォーカスしていて、そんなすごい人がいるんだと胸が高鳴りました。仕事で必ずいるわけではないですが、開発に至るまでの変遷も教養として知っておくのはいいかもしれませんね。

ジョブレコメンデーションについてのリサーチまとめ

9月のイベントでジョブレコメンデーションについて調べて発表(実務と論文で学ぶ ジョブレコメンデーション最前線2022)しましたが、ブログの方が情報量が多いのと、最近のSlideShareが非常にみづらいものになっているのに加え、アップデートもしやすいのでこちらに随時残せる記事を残しておこうと思います。今日はクリスマスなので、誰かにとってはクリスマスプレゼントとなりうるでしょうか。

業界にいるものとしての思い

私は大学時代に経済学部に通っていたときに、労働市場の流動性に関して興味を持っていました。
スキルさえあればすぐに労働者が転職をするという競争的な労働市場について思い巡らすことがありました。

しかしながら、就職活動を通じて、取ってつけたような志望動機で大して勉強をしてこなかったであろう人々と同列に扱われ、「労働市場の効率性に関して、現実は不確実な情報のなかでエイヤで決めるしかないのかな」という印象を感じました。

就職活動では求人メディア系の会社に入社しました。スキルある人が高い給与を享受しやすい仕組み作りをデータ分析の力で実現できたらいいなと思って入りました。

ジョブマッチング界隈の課題

この業界の課題については推薦システム実践入門 ―仕事で使える導入ガイドの8章5節のドメインに応じた特徴と課題で、仕事の推薦について書かれているのも参考になりますので、そちらも合わせてお読みください。

  • 双方の情報の充実化
    • 情報の非対称性を払拭できるだけの情報がない中で企業も候補者も面接に臨んでいる
  • 求人票の充実化
    • 何かしらのエージェントを使う際に自分が本当に行きたい、行くべき職場がないかもしれない
  • 求人票の質の向上
    • 候補者が企業に直接応募するにしても、求人票に記されたレベル感が曖昧なため

ジョブマッチング界隈のデータの課題

  • スキルや職歴の構造化データ化
    • 正確なスキル情報の記載
    • 所属した企業に関しても法人番号などを付与できるといい
  • 求人情報の記載項目の誤り是正、更新性アップ
    • 今は求めていない要件があるとか、扱う技術に変化があったとかを反映
  • 希望する仕事内容や職場の要望のデータ化
    • 希望する仕事について構造化データになっていない

ジョブマッチング系の論文色々

・Job Recommender Systems: A Review(2021)
・Domain Adaptation for Resume Classification Using Convolutional Neural Networks(2017)
・Implicit Skills Extraction Using Document Embedding and Its Use in Job Recommendation(2020)
・Machine Learned Resume-Job Matching Solution(2016)
・SKILL: A System for Skill Identification and Normalization(2015)
・Effectiveness of job title based embeddings on résumé to job ad recommendation(2021)
・conSultantBERT: Fine-tuned Siamese Sentence-BERT for Matching Jobs and Job Seekers(2021)

Job Recommender Systems: A Review(2021)

  • 論文の概要
    • Job Recommender System(JRS)研究のサーベイ論文(2011〜2021)[計133本]
    • 近年は求人などの大量のテキストを用いたジョブレコメンデーションが多い。深層学習も使われている。BERTもCNNも使われている。ハイブリッドモデルが多い傾向。
    • 近年ではアルゴリズムの公平性(年齢/性別での差別)に関心が持たれており、特徴量として差別的なものがなくても学習してしまう可能性が指摘されている。
    • 求職者とリクルーターのインタラクティブなデータ(click/skip)の利活用が重要となっている。研究者はRecsysなどのコンペのデータに依存しており、企業がデータセットの提供をするのが限定的であるのが問題としてある。JRSの発展のためにはKaggleやRecsysのコンペが重要とされている。
  • 参考になるところ
    • 求職者と採用担当者のインタラクティブなデータはこのコミュニティでデータとして貴重であること
    • 最近はTransformer系のアプローチが使われ始めていること

Domain Adaptation for Resume Classification Using Convolutional Neural Networks(2017)

  • 論文の概要
    • 27の職種のラベルが付与された求人票のデータ(テキスト:短文)をもとにCNNで分類器を作成
    • ラベルがない職務経歴データに関しては求人票で学習したモデルで推論
    • fastTextでの分類よりも性能が向上した

    • 求人票の数 > 越えれない壁 > 職務経歴データの数
    • CNNで学習する際の特徴量は学習済みのWord2Vecによる単語の分散表現で、同じ長さのものを使っている。
    • 最大値プーリングでの重要な特徴抽出、ドロップアウトの正則化など画像分類タスクと同様になされ、soft-max関数でマルチクラスの確率を出力している。
    • 苦手な職種でのファインチューニングがfuture work
  • 参考になるところ
    • 職務経歴書と違って収集が容易な求人票のデータをもとに学習し、職務経歴に関するラベルを推論をするスタイル
    • テキストデータに対してCNNを使っている

Implicit Skills Extraction Using Document Embedding and Its Use in Job Recommendation(2020)

  • 論文の概要
    • 職務経歴書や求人からNLPでスキル表現を抽出
    • 暗黙的なスキル表現も抽出
    • 候補者と求人のマッチングのスコア(Affinity Score)を定義
    • 暗黙的スキル情報を使うとマッチングの性能がアップすることがわかった
    • テキストに対して3つの観点でスキル抽出
      ・NER(Named Entity Recognition(固有表現抽出))を適用→文書内のスキルの位置を見つける、カテゴライズを行う
      ・PoS(Part of Speech(品詞の付与))を適用→スキル表現かどうかは専門家によるアノテーションを実施
      ・色々集めた辞書にあるか計算→Wikipedia、Onet/Hopeというサイトなどで自動での拡張型スキル辞書用意
    • 暗黙的なスキル表現も抽出
      暗黙スキル(Web DevelopmentやHard Workingなどの表現)の考慮→分散表現の平均値で表現
    • スキルとの関連度スコアの定義
      職務経歴書や求人からのスキル抽出のためにスコアを用いる
    • 表現の除外
      関連度スコアに閾値を設けて下回ったらその表現を除外するなどを行う。
    • 関連度スコア(x)
      ・NERで抽出した表現の信頼度(S1)
      ・文法が、事前に定義したルールにどれだけ合っているか(S2)
      ・そのスキルがNERで得たスキルっぽいもの、ポテンシャルスキル、辞書スキルの3つの辞書にどれだけ合致したかの割合(S3)
      ・その単語とスキル辞書との分散表現における最大のcos類似度の値(S4)
      ・パラメータは経験則的に決める
      ・関連スコアは0~1の間をとる
    • アフィニティスコア
      ・候補者と求人のマッチの適切さの指標
      ・エッジウェイトの平均としている
    • エッジウェイト(Y)
      ・スキル間のcos類似度(E1)
      ・文書を通じたスキルの出現頻度の割合(E2)
      ・明示的なスキルがあるかどうか(E3)→暗黙だと減点
      ・ウェイト(ω)はそのマッチングが成功したかどうかで重み付ける。
      ・関連スコアは0~1の間をとる
  • 参考になるところ
    • 暗黙的なスキルに関して着目したところ
    • スコアリングのモデルを定め、手元にあるデータとWikipediaなどの集合知も使ってかなり慎重にスキル抽出を行っている
  • Machine Learned Resume-Job Matching Solution(2016)

    • 論文の概要
      • 深層学習(CNN)を用いて、リッチな特徴量を用意した上で、職務経歴書と求人のマッチング最適化を行っている
      • 職務経歴書の数は4.7万枚
      • KerasやScikit-learnで書かれており軽量
      • 浅いモデルとしてXGBoostを、深いモデルとしてCNNの両方を、最終的に多数決によるアンサンブルにすることで性能が向上
      • アンサンブル手法としてはバギングを行っている
      • リッチな特徴量
        ・Manual Feature(年齢とか性別とか)
        ・Cluster Feasture(クラスタリングしたもの、トピック(LDA))
        ・Semantic Feature(意味的な類似度)
      • モデルはGPUでもCPUでも動く
      • ソースコードはGitHubで公開されてる

    • 参考になるところ
      • CNNながらGPUなしでも計算できるようなモデルのアーキテクチャになっている
      • 特徴量はマニュアルで作成したものと自動で抽出したものの両方をうまく使う

    SKILL: A System for Skill Identification and Normalization(2015)

    • 論文の概要
      • 職務経歴書や求人に記されているスキルの抽出に関するNER(Named Entity Recognition:固有表現抽出)の研究
      • 老舗の求人サイトであるCareerBuilderの
        社員による研究
      • Wikipediaベースのカテゴリ分類、Google検索による集合知を利用してスキル表現の抽出をしている
      • Word2Vecを用いて、あるスキルと関連しているスキルをもとにタグ付をするアプローチが紹介されている
      • データ
        大量の職務経歴書と求人票
      • アプローチ
        ・スキル分類→wikipediaベースのAPI、国の定めた定義など
        ・スキル判定→単一語(そのまま利用)、複数語(Google検索結果から判断(集合知))
        ・スキルタグ付け→Word2Vecをユニグラムで学習し、関連度を計算しスキルのタグ付け
    • 参考になるところ
      • Google検索を使って得た集合知をスキルの分類に活かしている
      • Word2vecで計算した類似度をもとにスキルのタグ付けをしている

    Effectiveness of job title based embeddings on résumé to job ad recommendation(2021)

    • 論文の概要
      • 求人票の表現に対して、分散表現を用いた求人レコメンドの研究
      • 求人票全体を使うよりも、タイトル部分を使ったほうがレコメンドの性能が高くなった
        ・分散表現はWord2VecやDoc2Vecの学習済みや学習したものを色々試している
        ・Cold-Start問題に対しても分散表現は有効な手段であるとしている
    • 参考になるところ
      • 汚い本文のテキストを使うよりもタイトルを使ったほうが良いと言う、岡目八目というか、労せずに成果を出す作法を知れたという気持ち
      • 分散表現がCold-Start問題に対する有効な手段という可能性

    conSultantBERT: Fine-tuned Siamese Sentence-BERT for Matching Jobs and Job Seekers(2021)

    • 論文の概要
      • データは27万件で正例が12.6万件、負例が10.9万件で職務経歴書(ユニークだと15万件)と求人票(2.3万件)からなる。ラベルはキャリアアドバイザーが付けたもの。
      • 各センテンスに対してBERTを適用し、文書単位で平均を取るなどしている。文書は最初の512トークンを使うのがよいとしている。
      • BERTを分類問題・回帰問題についてそれぞれSiamese network(シャムネットワーク)を用いてファインチューニング
        ・出力層は求職者のレジュメと求人票のCOS類似度をマッチングスコアとしている
        ・埋め込み層のデータで教師あり学習をランダムフォレストで行い、COS類似度ではなくランダムフォレストの吐いたスコアを使って推論するバージョンも用意している
      • 回帰タスクでのファインチューニングが一番よかった
    • 参考になるところ
      • BERTをセンテンスに対して使って、平均値をとりそれを特徴量にしている
      • 全文を使わないほうが分類性能が良い可能性
      • 埋め込み層のデータで教師あり学習をして、それのスコアを用いるというアプローチ

    仕事用に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