エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

機械学習エンジニアインターンがすごい楽しかった話

こんにちは!エムスリーのエンジニアリングG、AI・機械学習チームで2週間ほど機械学習エンジニアインターンをしていました、松岡玲音と申します!(Twitterアカウント: @lain_m21)普段はマサチューセッツ工科大学の博士課程でロボティクスの研究をしたりしています。インターンとっても楽しかったので、これからエムスリーでのインターンを考えている人や、エムスリーのAIチームでの仕事に興味のある人たちにぜひ読んでいただきたいです♪

簡潔に良かった点をまとめると、

  • 実際の業務に使われる機械学習アプリの開発ができて、達成感があった

  • チームでの開発やテストのノウハウなど、研究室や個人レベルでの開発ではなかなか得られない経験ができた

  • メンターの西場さんが(特に)強かったので、いい感じにストレッチされて自分の成長に繋げられた

こんな感じです!これら以外にも、私個人に最適なインターンのテーマを考えていてくれたり、期間中は1 on 1のミーティングの時間を設けてくれたりと、ただのインターンではなくチームの一構成員として扱ってくれる感じが常にあってとても嬉しかったです。その分、自分のプロジェクトへの責任や当事者意識などは強く意識する必要があり、程よく良い緊張感を持って取り組めました。

ここからは、実際に私が期間中どのようなことをしたのか、どのように取り組んだのかなどを簡潔に書いていきますね♪

Gauss - 記事のタグ付けシステム

インターンで与えられたプロジェクトは、エムスリーが配信する様々な医療系の記事に対して、疾患名や薬剤名のタグ付けを行うGaussというシステムの開発でした。(AIチームでは、歴史上の数学者の名前を各プロジェクトにつけるという文化があります。)

エムスリーは医療従事者向けに様々な記事を毎日配信しています。これらの記事に疾患名や薬剤名の適切なタグを付けることで、より精度の高いキーワード検索や記事のサジェストができたり、タグのトレンド分析などを行ったりすることが可能になったりと、色々嬉しいことがあります。

メンターにはAIチームのリーダーの西場さんがついてくれて、都度私のアイデアをいい方向に修正してくれたり、プロジェクトを効率よく進める考え方を指導していただいたりしました。

既存のシステムの問題点

Gaussはすでにプロトタイプ版が動いてはいたのですが、登録されている薬剤・疾患名と記事中の単語とのマッチングのみを使ったシンプルなモデルで、主に以下のような問題を抱えていました。

  1. 記事の内容に全く関係のないタグが含まれてしまう(「みなさまも熱中症にお気をつけて〜」 -> タグ「熱中症」など)

  2. 記事の主題から外れたタグも含まれてしまう(ある疾患の合併症やリスクファクターとして列挙されている疾患名など)

  3. 略称や表記揺れがあった場合にタグ付けできない(ADHDは「注意欠陥多動障害」としてしかデータベースに登録されていない!)

1の問題は特に面白く、「〜していただきますよう、〜」などの語尾にある「よう」が疾患名の「よう(癰)」(皮膚の病気の一種)として全て拾われて、全体の40%ほどの記事にそのタグがついてしまったりしていました。

また、各記事には正解タグがなく、ある程度知識がある人が目視で見てなんとなくOK!という感じでしか評価できないというのも大きな問題でした。

インターン期間中に行ったシステムの改善

上に示したそれぞれの問題について、一つ一つ改善を行っていきました。簡単にまとめると、

  • 略称や表記揺れに対応する知識ベースの構築

  • TF-IDF値による重要度のランク付けによるタグの絞り込み

  • タイトル・薬剤名から得られる疾患名を優先する

といったことをそれぞれ実装し、上記の問題を解決していきました。また、私自身が元薬学部出身ということもあり、タグ付けされた記事と睨めっこしながら改善点を探っていくかたちで進めていきました。

略称や表記揺れに対応する知識ベースの構築

略称や表記揺れなどは、データベース側を整えるだけで大きく改善します。略称についてはWikipediaの「病気の別名の一覧」というページをスクレイピングして略称正規化テーブルを作成し、表記揺れはMedNLPという研究グループが公開している「万病辞書」というものを使わせてもらってそれぞれ対応しました。

TF-IDF値による重要度ランク付け

上に書いたように、各記事に対する正解タグは実質存在せず、かつタグに使う疾患名・薬剤名も膨大なので、通常の教師あり学習でラベル予測するタスクにすることはできません。しかし記事はかなりの量が蓄えられているので、そこからTF-IDFモデルを学習させて、教師無し的に重要なタグとそうでないものを選別するようにしました。

TF-IDF(Term-Frequency, Inverse-Document-Frequency)値とは、以下のように計算できる、単語の文中での重要度のような指標です。(参考:TF-IDFで文書内の単語の重み付け | takuti.me

$$TF(t,d): 文書\ d\ 中における、単語\ t\ の相対的な出現頻度$$

$$IDF(t): 単語\ t\ の全文書中での出現頻度の逆数$$

$$TF\text{-}IDF(t,d) = TF(t,d) * IDF(t)$$

ざっくりまとめると、ある記事の中で他の単語より多く出てきて(高TF値)他の記事ではなかなか出てこない単語(高IDF値)は、その記事の中で重要な単語であると考えられる、というのがTF-IDFによる重要度ランク付けの解釈です。

このTF-IDF値でランク付けをしてtop-Kの単語だけを拾ってくることで、「よう」などの明らかに不要なタグを弾くことができるようになります。

タイトル・薬剤名から得られる疾患名を優先

記事のタイトルに現れる疾患名や、記事中で多く現れる薬剤名に関連する疾患は他のものよりも重要であると考え、それらから付けられるタグを、他の記事から取れてくるタグに優先するようにしました。これで、主題の疾患の合併症やリスクファクターなどの関連度の薄い疾患名をタグから取り除くことができるようになりました。

プロジェクトの管理、ビジネスサイドとのコミュニケーション

エムスリーのAIチームはチームでの開発を重視し、プロジェクトのリポジトリやみんなで共通して使用するモジュール群が丁寧に管理されています。機能を拡張するときは常にブランチを切って、2人以上からコードレビューを受けてOKが出ないとマージできないなど、コードを綺麗に保つ体制ができています。私がインターン中に行ったGaussの上記の改善や、それに付随するモジュールへのコミットなども全て丁寧にコードレビューしてもらいました。

また、モジュールの機能を保障するために、常にテストを書くようにも指導されました。個人で開発してきた経験しかなかったので、テストを都度書いて動作を確認していく開発スタイルを学べたのは大きな収穫であったと思います。

また、Gaussはその性能を明確な数値で測ることが難しいため、Gaussを実務で使う予定のあるビジネスサイドの人たちとタグ付けの結果を共有して、必要な性能について何度も話し合う必要がありました。ビジネス側の人たちの理想を吸い上げながらこちらの現実的な提案をうまく通していくコミュニケーションが、機械学習エンジニアには必要なのではないかと強く感じました。

まとめ

エムスリーでの2週間は総じてとても充実したものでした。最終的には担当したGaussの性能をかなり改善でき、今後実際にエムスリーの様々なサービスや業務で使ってもらえるようでとても嬉しいです。実務で運用するものを責任を持って開発するというのはなかなか緊張感がありますが、その分達成感は大きいです。メンターの西場さんを始めとして、エンジニアリングG、AI・機械学習チームはみんなそれぞれ高い技術力を持っているので、短期間でも色々なことを学べると思います。

f:id:lain21:20180927145226j:plain

私(右)とメンターの西場さん(左)

チームの雰囲気も良く、よく冗談をslackで飛ばしあったり、ミーティング中に誰かがダジャレを言って笑いが起きたり、楽しい職場でした。また、トランスジェンダーMtFである私も社内で普通に快適に過ごせて、社員用の女性トイレも使わせてもらえたりと、ジェンダーフリーでとても働きやすかったです。エムスリーのAIチームでのインターンや開発業務に興味を持った方は、ぜひ応募してみてください!

jobs.m3.com