Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

【ML Tech RPT. 】第14回 機械学習のモデルの評価方法 (Evaluation Metrics) を学ぶ (5)

f:id:ssatsuki040508:20181210005017p:plain
DSOC研究員の吉村です. 年末年始の連休で本をたくさん読むぞと意気込んだにも関わらず, 2.5冊しか読めなかった悔しさに苛まれております.

さて, 今回も前回に引き続き評価指標についてまとめていきます. 特に, ランキング学習の出力結果を評価する際に用いられる指標について見ていきましょう. マルチラベル分類の文脈における, ランキング学習の出力結果の評価指標の一部については, 前回の記事で紹介しておりますので, そちらも読んでいただけると嬉しいです.

ランキング学習の精度評価

ランキング学習とは, 対象物の順序を予測するように学習する問題です. マルチラベル分類の予測時に各ラベルの信頼度を計算するようなモデルを用いる場合には, その信頼度の大小によって順位付けができるため, マルチラベル分類とも関係の深い問題設定です. そのため, ランキング学習の評価指標がマルチラベル分類の予測結果の評価に使われることも度々あります.

今回は, ランキング学習の評価指標として下記の 7 個を紹介します.

  • Discounted Cumulative Gain (DCG) [*1, *2]
  • normalized Discounted Cumulative Gain (nDCG)
  • Mean Reciprocal Rank (MRR)
  • Kendall rank correlation coefficient, Kendall's  \tau
  • Spearman's rank correlation coefficient, Spearman's  \rho
  • Yandex's pFound [*3, *4]
  • Expected Reciprocal Rank (ERR) [*5]

ただし, 今回はランキング学習の評価指標という意味の中に, なんらかのモデルの出力として得られるランキング結果の性能を評価するというかなり広義の意味を含めています. そのため, ここで紹介する各種指標は何が与えられているか (e.g. 真のラベル, 真のランキングなど) によって, 使えるものが異なることに注意してください. また, ランキングを扱うという点で Information Retrieval (IR) の色が強いため, 今回は並べ換える対象のことをドキュメントと呼ぶことにします. この部分は適宜, 並べ換えるアイテムとして読み替えてもらえるといいかと思います.

*1:K. Järvelin, and J. Kekäläinen, "Cumulated gain-based evaluation of IR techniques," in TOIS, 2002.

*2:C. Burges, T. Shaked, E. Renshaw, A. Lazier, M. Deeds, N. Hamilton, and G. Hullender, "Learning to rank using gradient descent," in ICML, 2005.

*3:A. Gulin, P. Karpovich, D. Raskovalov, and I. Segalovich, "Yandex at romip’2009: Optimization of ranking algorithms by machine learning methods," in ROMIP, 2009.

*4:I. Segalovich, "Machine learning in search quality at yandex," in SIGIR, 2010.

*5:O. Chapelle, D. Metzler, Y. Zhang, and P. Grinspan, "Expected Reciprocal Rank for Graded Relevance", in CIKM, 2009

続きを読む

Podcast #7 Engineering Management & Coaching

人事部 高橋 です。

今回の Podcast ではSansan事業部プロダクト開発部 組織デザイングループの谷内をゲストに迎えました。

当社のエンジニアリングマネジメントへの取り組みとして、ピープルマネジメントやコーチング、1on1の話をしてもらいました。

soundcloud.com

どんな取り組みをしているかがわかる、ものすごく良い内容になったんじゃないかなと思います🙂

続きを読む

【Techの道も一歩から】第24回「高速かつ省メモリな辞書ライクなライブラリDAWG」

f:id:s_yuka:20190621163804j:plain

こんにちは。 DSOC R&D グループの高橋寛治です。

Pythonの辞書オブジェクトは取り扱いやすいため、単語とIDの変換テーブルを作ったり、複合語の結合のためにデータ構造を工夫して簡易なトライ木を構築したりと、自分でコーディングすることがあるかと思います。

上記の場合は、ライブラリDAWGを使うことで省メモリかつ高速に、さらにできることが増えるかもしれません。 今回はそんな便利なライブラリの紹介をします。

辞書ライクなライブラリDAWG

DAWGはDirected Acyclic Word Graphのそれぞれの頭文字をとったものです。 日本語だと有向無閉路単語グラフでしょうか。

英語のWikipediaのページに少し詳しい説明があります。 トライ木に比べて、頂点の数がかなり少なくなるデータ構造であることが特徴のようです。

利用者側としては、省メモリかつ高速に辞書引きや共通接頭辞検索ができるライブラリであるということを押さえておくといいかと思います。

共通接頭辞検索とは、共通の接頭辞を持つキーを見つける検索のことです。 かな漢字変換システムにおける、かなと漢字の対応表を見つける箇所での利用がわかりやすい例です。 「きょういく」というかなを漢字に変換する場合を考えます。候補は「き」「きょ」「きょう」「きょうい」「きょういく」となり、それぞれに対応する漢字があります。 「きょう」で候補を定めたとすると、次は「いく」に対して「い」「いく」に対応する漢字をまた引きます。 このように共通の接頭辞に対して候補を高速に引くことがき、なおかつ省メモリで保持することができます。

DAWGのPython実装の公式ドキュメントはこちらです。 インストールは pip install DAWG で完了します。

公式ドキュメントのUsageに書いているDAWGクラスを簡単に紹介します。

  • dawg.DAWG : ユニコード文字のキーを保持し、検索が可能です
    • dawg.CompletionDAWG : dawg.DAWG のサブクラスであり、共通接頭辞検索などが可能です
      • dawg.BytesDAWG : dawg.CompletionDAWG のサブクラスであり、ユニコード文字のキーに対してbytesオブジェクトのリストを対応させます
        • dawg.RecordDAWG : dawg.BytesDAWG のサブクラスであり、 Pythonのstructでパッキングされたデータをユニコード文字のキーに対応させます
      • dawg.IntCompletionDAWG : dawg.CompletionDAWG のサブクラスであり、ユニコード文字のキーに対して、数値を対応付けます
    • dawg.IntDAWG : dawg.DAWG のサブクラスであり、ユニコード文字のキーに対して、数値を対応づけます
続きを読む

Sansan Labs 開発での Terraform ディレクトリ構成

初めまして。あけましておめでとうございます。
DSOC R&D アーキテクトの鈴木賢志です。

Sansan Labs*1 では、新しい働き方の実現を目指し実験的な機能を一部公開しています。私は普段、それらの開発を中心に、R&D から生まれるサービスの品質改善などに取り組んでいます。
今回は、Sansan Labs で活用している Terraform のディレクトリ構成と、どのような理由でこの形になっていったかを紹介したいと思います。

Terraformのディレクトリ構成

Sansan Labs ではクラウドに AWS をメインで使用しており、昨年からインフラ構成管理のツールとして Terraform の利用を始めました。

初めて Terraform を使い始めた時に、最も悩んだのが .tf ファイルやディレクトリをどのように分けるか、という点でした。
これに対し色々考えた結果*2、以下のように落ち着きました。

terraform_project_root
├── env
│   ├── dev
│   │   └── main.tf
│   └── prod
│       └── main.tf
└── modules
    ├── module_1
    │   ├── main.tf
    │   ├── output.tf
    │   └── variables.tf
    ├── module_2
    │   ├── main.tf
    │   ├── output.tf
    │   └── variables.tf
    ├── ...

簡単にまとめると Terraform の Module という、構成をテンプレート化して再利用できるようにする機能を用いて、 環境ごとに分離したmain.tfファイルに、実際のインフラを表現していくといった戦略です。

*1:Sansan Webサービス内の右上にある、フラスコアイコンから利用できます。

*2:検討する上で一番はじめにヒットし参考にさせていただいたのは、クラスメソッド様のこちらの記事になります。ありがとうございます。

続きを読む

VAEに基づくグラフの表現学習

こんにちは。年末年始はファイアーエムブレムで可処分時間が消えてしまった DSOC R&D Group の橋本です。
さて、今回の記事では、変分オートエンコーダ (Variational Auto-Encoder, VAE) [1]に基づくグラフの表現学習について紹介したいと思います。
近年グラフに対する深層学習手法の発展が目覚ましく、応用先としては材料科学(分子や結晶をグラフと見る)*1や、ソーシャルネットワークなどが挙げられます。ここではソーシャルネットワークのようなグラフに対するものに限定して、ノードの潜在表現を得る手法を紹介します。*2

*1: 私はもともと化学を専攻していたというのもあり、材料科学に対するグラフ機械学習の手法にも興味があったりします

*2: VAEを用いたグラフの表現学習において、応用ドメイン先によって発展のアプローチが異なるようです。大規模なソーシャルネットワークについては本記事で紹介するようにノード埋め込みの解釈性向上についての研究が多いです。一方で例えばVAEを材料科学に応用する場合、新規材料の候補を生成することが一つの目的となります。それを達成するためにはできるだけ化合物が化学的に正しいように生成されることが重要となるため、いかに化合物の原子価の規則を守ったまま分子をdecodeするかについての研究などが主に進んでいます[7, 8]。

続きを読む

CSIRTになって思うこと

はじめまして。CSIRTの松田です。 今年の4月からセキュリティエンジニアとしてSansanで働いています。 前職では主にインフラエンジニアとして物理的な配線設計から保守運用まで幅広く携わりました。 インフラと向き合う中でセキュリティ対策装置に触る機会が多く、その奥ゆかしさに惹かれてセキュリティの世界にのめり込み、今に至ります。

私がSansanのセキュリティエンジニアに転身しようと考えた理由は、自身の経験が活かせることはもちろんですが、社としてのセキュリティに対する思いに共感したからです。

セキュリティと利便性を両立させる

これは企業理念「Sansanのカタチ」のPremiseとして、相反するセキュリティ利便性両方に徹底的に向き合うことを掲げています。 この、一見相反する両立が難しい事柄と常に向き合うことで圧倒的に成長できると確信しSansanのセキュリティエンジニアとなりました。

f:id:ss-matsuda:20191222204622j:plain

本記事は、これからセキュリティエンジニアを目指す方、興味のある方、そもそもCSIRTってどんな業務をやっているか謎だという方に少しでも参考になれば幸いです。

セキュリティエンジニアと言っても幅広い意味を持つので、その一要素であるCSIRTに焦点を当てます。私自身、CSIRTに従事するのは今回が初めてだったため、表面的には理解していたものの実際にどのような業務を行うのか理解を深める目的で情報を整理し、まとめてみました。

続きを読む

歴史をたどってディープラーニングを学ぶ 第三回 Cifar10と勾配消失問題についての考察

こんにちは、ニューラルネット老人こと糟谷勇児です。
最近は恐竜に凝っていて化石を買ったりしています。ニューラルネット界の化石と化してしまう前に、今回もディープラーニングを勉強していきたいと思います。

さて、前回はReLUについて自作のプログラムで検証しました。
これまでMNISTを題材にしてやってきましたが、MNISTの認識はディープラーニングより単純な手法のほうがうまくいくと思われるので、いまいち真実味に欠けるところがありました。

そこで、今回はタスクをちょっとだけ難しくするべくCifar10というデータセットに挑戦していきます。
https://www.cs.toronto.edu/~kriz/cifar.html

Cifar-10

ちなみにCifarはCanadian Institute For Advanced Researchの略のようです。暗号を表すCipherと似てるのでいつもわからなくなります。

Cifar-10には、10種類のクラスがあり、airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truck がそれぞれ数字でタグ付けされています。
マルチクラス分類は学習データが必然的に増えるのでクイックに検証をまわすために、今回は2クラスに絞ってみます。
やはり一番かわいい猫を選びたくなりますね。

画像を見てみると・・・

f:id:kasuya_ug:20191222181727j:plainf:id:kasuya_ug:20191222181730j:plainf:id:kasuya_ug:20191222182140j:plainf:id:kasuya_ug:20191222182142j:plainf:id:kasuya_ug:20191222182145j:plain
小さいけど猫だ。

f:id:kasuya_ug:20191222181144j:plainf:id:kasuya_ug:20191222181321j:plainf:id:kasuya_ug:20191222181555j:plainf:id:kasuya_ug:20191222181724j:plain
ねこ・・・?

f:id:kasuya_ug:20191222181422j:plain
ねこ・・・だけど・・・。

今回のような認識タスクでは、人がミスったものを目で見て「これはしょうがないでしょ」とか「これはなんで認識できないんだろう」など分析するんですが、結構判断に困る画像が出てきそうなので、比較的わかりやすそうな飛行機と船を題材にすることにします。

飛行機
f:id:kasuya_ug:20191222182351j:plainf:id:kasuya_ug:20191222182354j:plainf:id:kasuya_ug:20191222182357j:plainf:id:kasuya_ug:20191222182400j:plainf:id:kasuya_ug:20191222182402j:plain


f:id:kasuya_ug:20191222182254j:plainf:id:kasuya_ug:20191222182256j:plainf:id:kasuya_ug:20191222182259j:plainf:id:kasuya_ug:20191222182301j:plainf:id:kasuya_ug:20191222182304j:plain

なお、Pythonの場合はPickelした画像が用意されているのですが、C#にはないのでファイルに落としてから、OpenCvSharpというC#用のOpenCVのラッパーを用いて読み込むようにしています。

続きを読む

© Sansan, Inc.