新卒エンジニアが日本最大のAI開発者カンファレンスGPU Technology Conferenceに登壇しました!!

はじめに

はじめまして、今年新卒エンジニアとして入社したAI室のコニーです。 9月中旬に開催された GTC Japan 2018 で、研究成果を発表する機会をいただき、ポスター発表をしました。 研究のテーマは、求人検索エンジン「スタンバイ」にあるAIエンジンの一つ、職種推定モデルの改善です。 今回、GTCで発表した研究内容と参加レポートを紹介します。

研究内容

職種推定とは

職種推定とは、求人内容からその求人に該当する職種・業種を推定します。 例えば、このような求人情報があるとします。

jobpost

これは営業と事務に関する仕事なので、職種推定のエンジンはこだわり条件のところに「営業」、「事務」のラベルを貼ります。文字の前アイコンが付いてない、「学歴不問」や「服装自由」のラベルたちは「こだわり条件推定」の結果になりますので今回は割愛させていただきます。

職種推定した結果は、検索を補助する機能として活用されています。モバイルでは以下のような感じで使われています。

mobile

スタンバイの特徴の一つ、地図から仕事を検索すると…職種推定の結果に合わせた色、アイコンのマーカーがいっぱい出てきます。このエリアはどんな求人があるか一目瞭然ですね。

map

サービス上では42種類ありますけど、予測モデルでは、279種類の職種に対応してます。 構造としては、こんな風になってます。

sys_struct

毎日スタンバイが色んなところで求人情報をクローリングして、タイトルと詳細のテキストを分析して、その求人に対して適切な職種ラベルを貼るのが目標です。 一つの求人は複数のラベルが付く可能性もあります。求人の用語、パターンは世間のトレンドと共に変化することが多いので、定期的にモデルを更新した方が精度も上がります。 今回任された仕事は、モデルの更新部分です。

どうして職種推定をやるの?

職種推定をやる理由は主に2つあります。

1つは、媒体ごとに異なる職種ラベルをうまくマージさせるためです。 スタンバイは、異なる求人媒体をクローリングしているため、媒体ごとに設定されている職種ラベルが微妙に違います。 例えば、媒体Aではファーストフードにカテゴライズされる求人が、媒体Bではハンバーガーショップにカテゴライズされる、といったケースがあるとします。各媒体で定義されている職種ラベルをそのまま持ってくる事もできますが、そのまま使うと職種ラベルの数が膨大になるため、カテゴリとして機能しなくなることが考えられます。 なので、参照元の媒体の職種ラベルをそのまま使うのではなく、スタンバイで設定した職種ラベルを割り振る必要があります。

2つ目は、ユーザーの利便性の上げるためです。 職種ラベルを設定することで、検索性を上げる&求職者が気になるクラスタへ行く動線を確保できる、といったメリットがあります。また、職種ラベルから検索したユーザーの行動データを担保しているので、分析した結果をビジネスやプロダクトに活用しています。

職種推定の課題

職種推定は一見簡単な分類問題になりますが、実は三つの課題が隠れています。

  • 1. シングルラベルのデータセットの問題

1つの求人に対して該当するカテゴリを全部割り当てたい(マルチラベルの推定)が、現状1求人1職種ラベルの訓練データしかないことが問題になっています。 例えば、ビズリーチの求人にはHRとITの職種ラベルが設定されていることが望ましいが、現状1つの求人に対して1つのカテゴリが設定されています。そのため、ビズリーチにHRのカテゴリが設定されていると、ITを希望する求職者がビズリーチの求人を見る機会が減る問題が考えられます。 なので、マルチラベルの問題に対して、シングルラベルの訓練データで実現したいです。

  • 2. 不均衡データの問題

職種ラベルの偏りがあり、「事務」や「飲食」など求人数が多いものは1万件以上ありますが、「動物園」や「図書館」の求人は数十件しかありません。 そのため、データをそのまま学習すると少数の求人の精度が悪くなるので、少数の求人の精度も担保するために、データ数が少ないものに対して考慮してあげる必要があります。

  • 3. 一般的な評価指標が使えない問題

分類問題でよく使われている精度評価(Recall、Precisionなど)が適応できない課題があります。 どのデータも職種ラベルが1つしか割り当てられていないので、マルチラベルの推定器が割り当てたその他の職種ラベルの情報を正解としてよいのか判断が難しい問題があります。(この問題をPU-learningという。)そのため、RecallやPrecisionのような、適切なラベルが割り当てられていることが前提のデータセットに対して評価する指標を使うことができません。そのため、今回の問題に対して評価指標を整える必要があります。

どうやって解決した?

それぞれの問題に対して以下の対応をしました。

  • 1. 職種ラベルの構造を利用する

職種ラベルのカテゴリ構造を利用して、シングルラベルでもマルチラベルの学習をできるようにしました。 実は、職種ラベルは、大分類・中分類・小分類と3層のレイヤーに分かれています。 例えば、飲食 ∋ 飲食店 ∋ 中華料理屋のように構造化されています。↓のようなイメージです。

3level

この構造に着目して、同じカテゴリなら部分的に正解とみなすように、各カテゴリごとにマッチしたときのスコアを設定しました。このカテゴリごとにマッチしたスコア(以後カテゴリスコアと呼ぶ)を用いて、マルチラベル推定モデルの評価に反映させています。 例えば、職種ラベルが中華料理屋のデータを、推定器が日本料理屋と予測した場合、小分類の職種ラベルは異なっていますが、中分類は同じ飲食店なので、部分的に正解として学習時に反映させています。

以下は今回の研究で設定したカテゴリごとのパラメータです。

  • 1.00: 小分類が一致(例:求人A:中華料理屋 == 求人B:中華料理屋)
  • 0.15: 中分類が一致(例:求人A:中華料理屋 == 求人B:日本料理屋)
  • 0.05: 大分類が一致(例:求人A:中華料理屋 == 求人B:コーヒーショップ)
  • 0.00: 一致しなかった

大分類一致と中分類一致の値がそれぞれ 0.05 と 0.15 になっていますが、これは次に紹介する傾向スコアの影響と合わせてチューニングしたため、値が小さくなっています。

  • 2. Propensityモデルを導入する

不均衡なデータでモデルの学習を行うためにマイクロソフトの研究所の論文で提案された「Propensityモデル」を導入して、各職種ラベルのデータの量に応じて傾向スコア(Propensity Score)で学習のペナルティを調整しました。以下の数式で表されます。

propensity

constantc

p_lは各職種ラベルの傾向スコアでペナルティを調整しています。p_lの値が大きいとペナルティも大きくなります。N_lは職種ラベルごとのデータ数で、AとBは調整できるパラメータです。データ数が多い職種ラベル(N_lが大きい)は傾向スコアが低くなり、データ数が少ない職種ラベルは傾向スコアが大きくなります。なので、事務や飲食などのデータ数が多い職種ラベルは学習のペナルティが小さめになり、図書館や動物園などのデータ数が少ない職種ラベルはペナルティが大きくなるように調整しています。

  • 3. ランキングの評価指標を採用する

評価指標にNDCG@kというランキングの評価手法を使用しました。上の論文を参考にして、一般的使われてるKは1、3、5なので、それにしました。 ランキングの評価指標を採用した理由として、欠損ありのマルチラベル学習でよく使われてるため採用しました。

NDCG@kは以下の数式で表します。

dcg

ndcg

各パラメータですが、rel(i)は求人と職種ラベルの適合度です。適合度は、カテゴリスコアx傾向スコアで求めています。順位が高いほど、DCGスコアへの影響が大きいです。idealDCGというのは、適合度が高いものから順に並べた時のDCGスコアになります。このランキングのスコアでモデルの評価をします。

実験

実験では、ニューラルネットワークをベースとしたモデルを使いました。現在、サービス上で動いているMLPと、GRUとAttentionのモデルで比較しました。実験で使うデータセットはスタンバイの求人データ(約200万件)を使い、5-fold cross-validation で検証しました。モデルの評価には、今回の記事で紹介した NDCG@k と Coverage@k で評価しています。(Coverage@kとは推定した職種ラベルの確率上位k番以内に、正解の職種ラベルが含まれている割合を指標としています。)

Bi-GRU-Att(Attentionの略)の例です。ネットワーク構造は下図になります。

model

入力に求人のタイトルとコンテンツのテキストを使い、出力に職種ラベルを設定しています。入力のテキストは単語の分解して、word2vecでベクトル化しています。(NNやGRU、Attentionについて詳しく説明したいところですが、尺の都合上割愛させていただきます。)

どれくらい改善した?

実験の結果、以下のようになりました!

result

評価の仕組みを整えたので、精度を測れるようになった。サービスにあるMLPモデルより性能のいいモデルを提案できた。

研究成果を持って、いざGTCへ…!!

GTC参加レポート!

9月13、14日に、イベントに登壇&参加してきました!

  • GTCとは?

大手GPUメーカーのNVIDIA社が主催する日本最大の AI 開発者カンファレンスです。GTCJapanは9月13日、14日に開催しました。Google、Facebook、IBM、Sonyなどの大企業も多数参加してます。基調講演はホームページで配信してます。

gtcppl

人がいっぱいいます…ポスター参加者は別の列に並べるのでかなり早く入れました。

企業スペースと、ポスターセッション、世界中のAI研究者たちによる講座があります。今回はポスターセッションで発表しました。ポスターセッションタイム以外の時間は自由に講座に参加してもいいとのことです。

lecture

AIで使われてる最先端の技術を知ることができる貴重なチャンスです!参加者と講座担当も外国籍の方が大勢いるので講座は通訳サービス付きです。英語と日本語が選べます。

womenintech

女性参加者限定のランチイベント、Women-In-Techに参加しました!NVIDIAヘルスケア事業のバイスプレジデント、Powell氏からのスピーチ。女性でも技術分野でもっと活躍して欲しいとのことです。自身のキャリアについても、尊敬してる女性技術者のことも、いっぱい話してくれました。女性技術者としての働き方について、とっても素敵な考え方がある方です。他の参加者よるライトニングトークがあります。みんなも「女性の同僚が欲しい!」って言いました。みんな考えてることは同じなんですね。笑。私ももっとエンジニア女子が増えるといいなぁと思ってます。女性にしかできない発想がある、エンジニアにダイバーシティーが増えれば、もっといいプロダクトが生まれると、私は信じています。AI女子も増えてくださいお願いします。

dessert

Women-In-Tech参加者限定のデザートプレート!女子会でデザートは欠かせません。ホテルのデザートなので、とっても美味しかったです!

posterppl

ポスターセッションも人がいっぱい…!エンジニアの方も、研究者の方も大勢見に来てくれました。

back

説明を聴きに来てくれる方もたくさん。英語のポスターだったので外国人の方も見に来てくれました。説明は3ヶ国語で頑張りました!

poster

マネージャーの菅谷さんも見に来てくれました!

wang

同じAI室の新卒エンジニア、王くんも年収推定についてのポスターを発表しました。

説明聴きに来てくれる方が想像以上に多かったため、普通の業務より2、3倍以上疲れました…色んな方と交流できて、かなり貴重な体験だったため、楽しかったです。

  • 気になったこと

ポスター、企業スペースの発表内容は画像処理、無人運転、材料品質管理系が多かったです。自然言語処理の研究発表は少ないです。この領域はまだ発展途上なので、まだまだ改善すべきところがあって、製品化にするには不足の部分が多いのが原因ですかね。日本語のポスターが多かったので外国人が読めないというのも気になります。研究者としては、もっと色んな方と交流できるよう、やはり英語スキルが必要不可欠と思っています。

学んだこと

実用性、正確性を兼ねてこそ、いいモデルということを痛感しました…。 学術ではいつも完璧なデータ、精度の高いモデルが有るのが基本ですが、業務や応用の場面では、そう上手く行かないもんですね。 大学で自然言語処理の授業を受けた時、一番感銘を受けた言葉が「自然言語処理こそが究極の人工知能」、最初の授業で教授がそう言っていました。言語は、人類にしか出来ない特別なスキルであるからです。 自然言語処理ってやっぱり奥が深いです…いつか、機械でも人の言語を理解できるようになるといいですね!

Powell氏のスピーチ、女性技術者としての働き方も、すごく考えさせられました。私もいつか、Powell氏のような素敵な女性技術者になりたいと思います。 私としては、アルパカ語(?)を翻訳、またはアルパカの行動を理解し、世話する機械を作りたいです。(リモートアルパカ牧場やりたいです)

AIがもっと、人の役に立つと願っています。