Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Deep Learningを用いた類似画像レコメンドのSQL on Hadoopによる実現

nyuki
November 11, 2016

Deep Learningを用いた類似画像レコメンドのSQL on Hadoopによる実現

Cloudera World Tokyo 2016の登壇内容です

nyuki

November 11, 2016
Tweet

More Decks by nyuki

Other Decks in Technology

Transcript

  1. これまでの活動 登壇 2015/02:Developers Summit Winter 2015: リアルタイムレコメンド(Spark) 2015/11:Cloudera World Tokyo

    2015: Kafka 2016/02:Hadoop/Spark Conference Japan 2016: Hive on Spark プレスリリース “Sparkを活用したアジアパシフィック初のレコメンド基盤実現” http://www.cloudera.co.jp/customers/dmm.html 13
  2. HIVE (SQL) SQLでAPIを叩く 画像特徴 API .jar ④ score (JSON) ③

    http://xxx/img_src ( 画像 URL) ① SELECT get_image_tags(img_src) ② class getImageTags UDF 21
  3. UDF内部 (Java) public class getImageTags extends UDF{ public Map <String,

    Double> evaluate(Text imgSrc ){ ・ API 通信 ・ JSON パース ・ Map 型で結果を返却 } } 22
  4. UDFから取得した値を返却 SELECT tag_name , score FROM score_from_dl LATERAL VIEW explode(result)

    s AS tag_name , score "brown hair", 0.97 "brown eyes", 0.78 tag_name score brown hair 0.97 brown eyes 0.78 25
  5. 公開されている画像特徴APIの例 IBM Watson Visual Recognition Google Cloud Vision API Microsoft

    Cognitive Services - Computer Vision API http://www.ibm.com/watson/developercloud/visual-recognition.html https://cloud.google.com/vision/ https://www.microsoft.com/cognitive-services/en-us/computer-vision-api 26
  6. Deep Learning ライブラリ ライブラリ 言語 TensorFlow Python, C++ Caffe Python,

    C++ Chainer Python Torch7 Lua H2O Spark ・ Hadoop , R, Python Deeplearning4j Java/Scala (JVM 言語 ) MXNet C++, Go, Java/Scala, JavaScr ipt, Julia, Matlab, Python, R ① 過去の資産が豊富 ② NVIDIA の DeepLearning 学習ツール DIGITS が便利 DIGITS : https://github.com/NVIDIA/DIGITS 58
  7. ③結果の確認(REST API) $ curl localhost :5000/models/images/classification/classify_one.json -XPOST -F job_id=20150915-230450-2524 -F

    image_file=@horse_bird.png { “predictions”: [ [ “horse”, 0.8 ], [ “bird”, 0.7 ] ] } 66
  8. Amazon EC2 GPU インスタンス モデル GPU vCPU メモリ ( GiB

    ) ストレージ ( GB ) 料金 g2.2xlarge 1 8 15 1 x 60 $0.65 /1 時間 g2.8xlarge 4 32 60 2 x 120 $2.6 /1 時間 p2.xlarge 1 4 61 EBS のみ $0.9 /1 時間 p2.8xlarge 8 32 488 EBS のみ $7.2 /1 時間 p2.16xlarge 16 64 732 EBS のみ $14.4 /1 時間 NEW 67
  9. 71

  10. 類似度の算出方法 2 種類の方法で算出 ・画像の特徴の近さ ( コサイン類似度 ) ・画像の特徴の一致度 ( ダイス係数

    ) …2 商品間の特徴タグのスコアから類似度を算出 …2 商品間の特徴タグの集合の一致度から類似度を算出 72
  11. コサイン類似度計算 72. 響 73. 雷 74. 電 tag_id tag_name score

    1 silver hair 0.89 3 Serafuku 0.82 tag_id tag_name score 2 brown hair 0.96 3 serafuku 0.87 tag_id tag_name score 2 brown hair 0.97 3 serafuku 0.59 似てる? 似てる? タグ情報 75
  12. STEP 1: 正規化 SELECT score / SQRT(SUM(score * score) OVER(PARTITION

    BY id)) FROM contents ①正規化 id name tag_id tag_name score 72 響 1 silver hair 0.89 72 響 3 serafuku 0.82 73 雷 2 brown hair 0.96 73 雷 3 serafuku 0.87 74 電 2 brown hair 0.97 74 雷 3 serafuku 0.59 77
  13. SELECT score / SQRT(SUM(score * score) OVER(PARTITION BY id)) FROM

    contents STEP 1: 正規化 ①正規化 id 毎に分割 id name tag_id tag_name score 73 雷 2 brown hair 0.96 73 雷 3 serafuku 0.87 72 響 1 silver hair 0.89 72 響 3 serafuku 0.82 74 電 2 brown hair 0.97 74 電 3 serafuku 0.59 78
  14. STEP 1: 正規化 SELECT score / SQRT(SUM(score * score) OVER(PARTITION

    BY id)) FROM contents ベクトルの大きさ計算 id name tag_id tag_name score |score| 72 響 1 silver hair 0.89 1.21 72 響 3 serafuku 0.82 1.21 ①正規化 (0.89) + (0.82) 2 2 (a1 ) + (a2 ) 2 2 79
  15. STEP 1: 正規化 SELECT score / SQRT(SUM(score * score) OVER(PARTITION

    BY id)) FROM contents ①正規化 正規化 id name tag_id tag_name score |score| normalize 72 響 1 silver hair 0.89 1.21 0.73 72 響 3 serafuku 0.82 1.21 0.67 score |score| = normalize 80
  16. STEP 1: 正規化 SELECT score / SQRT(SUM(score * score) OVER(PARTITION

    BY id)) FROM contents ①正規化 正規化 72 響 1 silver hair 0.89 1.21 0.73 72 響 3 serafuku 0.82 1.21 0.67 73 雷 2 brown hair 0.96 1.30 0.74 73 雷 3 serafuku 0.87 1.30 0.67 74 電 2 brown hair 0.97 1.14 0.85 74 電 3 serafuku 0.59 1.14 0.52 id name tag_id tag_name score |score| normalize 81
  17. SELECT SUM(v1.normalize * v2.normalize) FROM normalized_vector AS v1 JOIN normalized_vector

    AS v2 ON v1.tag_id = v2.tag_id WHERE v1.id <> v2.id GROUP BY v1.id , v2.id , v1.name , v2.name STEP 2: コサイン類似度 ・ ②掛け合わせ id name tag_id tag_name normalize 72 響 1 silver hair 0.73 72 響 3 serafuku 0.67 73 雷 2 brown hair 0.74 73 雷 3 serafuku 0.67 74 電 2 brown hair 0.85 74 電 3 serafuku 0.52 normalized_vector 82
  18. SELECT SUM(v1.normalize * v2.normalize) FROM normalized_vector AS v1 JOIN normalized_vector

    AS v2 ON v1.tag_id = v2.tag_id WHERE v1.id <> v2.id GROUP BY v1.id , v2.id , v1.name , v2.name STEP 2: コサイン類似度 v1 v2 id name tag_id tag_name normalize 72 響 1 silver hair 0.73 72 響 3 serafuku 0.67 73 雷 2 brown hair 0.74 73 雷 3 serafuku 0.67 74 電 2 brown hair 0.85 74 電 3 serafuku 0.52 id name tag_id tag_name normalize 72 響 1 silver hair 0.73 72 響 3 serafuku 0.67 73 雷 2 brown hair 0.74 73 雷 3 serafuku 0.67 74 電 2 brown hair 0.85 74 電 3 serafuku 0.52 83
  19. SELECT SUM(v1.normalize * v2.normalize) FROM normalized_vector AS v1 JOIN normalized_vector

    AS v2 ON v1.tag_id = v2.tag_id WHERE v1.id <> v2.id GROUP BY v1.id , v2.id , v1.name , v2.name STEP 2: コサイン類似度 id name tag_id tag_name normalize 72 響 1 silver hair 0.73 72 響 3 serafuku 0.67 73 雷 2 brown hair 0.74 73 雷 3 serafuku 0.67 74 電 2 brown hair 0.85 74 電 3 serafuku 0.52 v1 v2 id name tag_id tag_name normalize 72 響 1 silver hair 0.73 72 響 3 serafuku 0.67 73 雷 2 brown hair 0.74 73 雷 3 serafuku 0.67 74 電 2 brown hair 0.85 74 電 3 serafuku 0.52 84
  20. SELECT SUM(v1.normalize * v2.normalize) FROM normalized_vector AS v1 JOIN normalized_vector

    AS v2 ON v1.tag_id = v2.tag_id WHERE v1.id <> v2.id GROUP BY v1.id , v2.id , v1.name , v2.name STEP 2: コサイン類似度 id name tag_id tag_name normalize 72 響 1 silver hair 0.73 72 響 3 serafuku 0.67 73 雷 2 brown hair 0.74 73 雷 3 serafuku 0.67 74 電 2 brown hair 0.85 74 電 3 serafuku 0.52 v1 v2 id name tag_id tag_name normalize 72 響 1 silver hair 0.73 72 響 3 serafuku 0.67 73 雷 2 brown hair 0.74 73 雷 3 serafuku 0.67 74 電 2 brown hair 0.85 74 電 3 serafuku 0.52 85
  21. SELECT SUM(v1.normalize * v2.normalize) FROM normalized_vector AS v1 JOIN normalized_vector

    AS v2 ON v1.tag_id = v2.tag_id WHERE v1.id <> v2.id GROUP BY v1.id , v2.id , v1.name , v2.name STEP 2: コサイン類似度 v1. id v1. name v1. tag _id v1. tag _name v1. normalize v2. id v2. name v2. tag _id v2. normalize 73 雷 2 brown hair 0.74 73 雷 2 0.74 73 雷 2 brown hair 0.74 74 電 2 0.85 73 雷 3 serafuku 0.67 72 響 3 0.67 73 雷 3 serafuku 0.67 73 雷 3 0.67 73 雷 3 serafuku 0.67 74 電 3 0.52 86
  22. SELECT SUM(v1.normalize * v2.normalize) FROM normalized_vector AS v1 JOIN normalized_vector

    AS v2 ON v1.tag_id = v2.tag_id WHERE v1.id <> v2.id GROUP BY v1.id , v2.id , v1.name , v2.name STEP 2: コサイン類似度 v1. id v1. name v1. tag _id v1. tag _name v1. normalize v2. id v2. name v2. tag _id v2. normalize 73 雷 2 brown hair 0.74 73 雷 2 0.74 73 雷 2 brown hair 0.74 74 電 2 0.85 73 雷 3 serafuku 0.67 72 響 3 0.67 73 雷 3 serafuku 0.67 73 雷 3 0.67 73 雷 3 serafuku 0.67 74 電 3 0.52 87
  23. SELECT SUM(v1.normalize * v2.normalize) FROM normalized_vector AS v1 JOIN normalized_vector

    AS v2 ON v1.tag_id = v2.tag_id WHERE v1.id <> v2.id GROUP BY v1.id , v2.id , v1.name , v2.name STEP 2: コサイン類似度 v1. id v1. name v1. tag _id v1. tag _name v1. normalize v2. id v2. name v2. tag _id v2. normalize 73 雷 2 brown hair 0.74 74 電 2 0.85 73 雷 3 serafuku 0.67 72 響 3 0.67 73 雷 3 serafuku 0.67 74 電 3 0.52 88
  24. SELECT SUM(v1.normalize * v2.normalize) FROM normalized_vector AS v1 JOIN normalized_vector

    AS v2 ON v1.tag_id = v2.tag_id WHERE v1.id <> v2.id GROUP BY v1.id , v2.id , v1.name , v2.name STEP 2: コサイン類似度 v1. id v1. name v1. tag _id v1. tag _name v1. normalize v2. id v2. name v2. tag _id v2. normalize 73 雷 2 brown hair 0.74 74 電 2 0.85 73 雷 3 serafuku 0.67 72 響 3 0.67 73 雷 3 serafuku 0.67 74 電 3 0.52 89
  25. SELECT SUM(v1.normalize * v2.normalize) FROM normalized_vector AS v1 JOIN normalized_vector

    AS v2 ON v1.tag_id = v2.tag_id WHERE v1.id <> v2.id GROUP BY v1.id , v2.id , v1.name , v2.name STEP 2: コサイン類似度 73 雷 2 brown hair 0.74 74 電 2 0.85 73 雷 3 serafuku 0.67 74 電 3 0.52 73 雷 3 serafuku 0.67 72 響 3 0.67 v1. id v1. name v1. tag _id v1. tag _name v1. normalize v2. id v2. name v2. tag _id v2. normalize 90
  26. SELECT SUM(v1.normalize * v2.normalize) FROM normalized_vector AS v1 JOIN normalized_vector

    AS v2 ON v1.tag_id = v2.tag_id WHERE v1.id <> v2.id GROUP BY v1.id , v2.id , v1.name , v2.name STEP 2: コサイン類似度 73 雷 2 brown hair 0.74 74 電 2 0.85 73 雷 3 serafuku 0.67 74 電 3 0.52 73 雷 3 serafuku 0.67 72 響 3 0.67 v1. id v1. name v1. tag _id v1. tag _name v1. normalize v2. id v2. name v2. tag _id v2. normalize 91
  27. STEP 2: コサイン類似度 SELECT SUM(v1.normalize * v2.normalize) FROM normalized_vector AS

    v1 JOIN normalized_vector AS v2 ON v1.tag_id = v2.tag_id WHERE v1.id <> v2.id GROUP BY v1.id , v2.id , v1.name , v2.name v1.id v1_nam e v2.id v2.name cosine_ similarity_ socre 73 雷 72 響 0.45 73 雷 74 電 0.97 92
  28. STEP 3: ランキング計算 ROW_NUMBER() OVER(PARTITION BY v1.id ORDER BY cosine_similarity_socre

    DESC) v1. id v1. name v2. id v2. name cosine_ similarity_ socre 73 雷 72 響 0.45 73 雷 74 電 0.97 93
  29. ROW_NUMBER() OVER(PARTITION BY v1.id ORDER BY cosine_similarity_socre DESC) STEP 3:

    ランキング計算 id 毎に分割 v1. id v1. name v2. id v2. name cosine_ similarity_ socre 73 雷 72 響 0.45 73 雷 74 電 0.97 94
  30. ROW_NUMBER() OVER(PARTITION BY v1.id ORDER BY cosine_similarity_socre DESC) STEP 3:

    ランキング計算 id 毎に分割 コサイン類似度順位並び替え v1. id v1. name v2. id v2. name cosine_ similarity_ socre 73 雷 74 電 0.97 73 雷 72 響 0.45 95
  31. ROW_NUMBER() OVER(PARTITION BY v1.id ORDER BY cosine_similarity_socre DESC) STEP 3:

    ランキング計算 id 毎に分割 コサイン類似度順位並び替え ランク付け ROW_ NUMBER v1. id v1. name v2. id v2. name cosine_ similarity_ socre 1 73 雷 74 電 0.97 2 73 雷 72 響 0.45 96
  32. コサイン類似度計算 tag_id tag_name score 1 silver hair 0.89 3 serafuku

    0.82 tag_id tag_name score 2 brown hair 0.96 3 serafuku 0.87 tag_id tag_name score 2 brown hair 0.97 3 serafuku 0.59 似てない 似てる 45% 97% 72. 響 73. 雷 74. 電 タグ情報 97
  33. ダイス係数 tag_id tag_name score 1 silver hair 0.89 3 serafuku

    0.82 tag_id tag_name score 2 brown hair 0.96 3 serafuku 0.87 tag_id tag_name score 2 brown hair 0.97 3 serafuku 0.59 似てる? 似てる? 72. 響 73. 雷 74. 電 タグ情報 100
  34. STEP 1: 各要素計算(各商品のタグ数) SELECT … , COUNT(1) OVER(PARTITION BY id)

    AS num_tags FROM contents id name tag_id tag_name 72 響 1 silver hair 72 響 3 serafuku 73 雷 2 brown hair 73 雷 3 serafuku 74 電 2 brown hair 74 電 3 serafuku ①各要素計算 各商品のタグ数 101
  35. SELECT … , COUNT(1) OVER(PARTITION BY id) AS num_tags FROM

    contents STEP 1: 各要素計算(各商品のタグ数) id 毎に分割 id name tag_id tag_name 73 雷 2 brown hair 73 雷 3 serafuku 72 響 1 silver hair 72 響 3 serafuku 74 電 2 brown hair 74 電 3 serafuku ①各要素計算 各商品のタグ数 102
  36. SELECT … , COUNT(1) OVER(PARTITION BY id) AS num_tags FROM

    contents STEP 1: 各要素計算(各商品のタグ数) id 毎に総数をカウント id name tag_id tag_name num_tags 73 雷 2 brown hair 2 73 雷 3 serafuku 2 72 響 1 silver hair 2 72 響 3 serafuku 2 74 電 2 brown hair 2 74 電 3 serafuku 2 ①各要素計算 各商品のタグ数 103
  37. STEP 2: 各要素計算(2つの商品のタグの積集合) ①各要素計算 2 つの商品のタグの積集合 id name tag_id tag_name

    num_tags 72 響 1 silver hair 2 72 響 3 serafuku 2 73 雷 2 brown hair 2 73 雷 3 serafuku 2 74 電 2 brown hair 2 74 電 3 serafuku 2 SELECT … , t1.num_tags AS n1 , t2.num_tags AS n2 , COUNT(1) AS n12 FROM tag_set AS t1 JOIN tag_set AS t2 ON tag_id = tag_id WHERE t1.id <> t2.id GROUP BY t1.id, t1.name, t1.num_tags , t2.id, t2.name, t2.num_tags 104
  38. SELECT … , t1.num_tags AS n1 , t2.num_tags AS n2

    , COUNT(1) AS n12 FROM tag_set AS t1 JOIN tag_set AS t2 ON tag_id = tag_id WHERE t1.id <> t2.id GROUP BY t1.id, t1.name, t1.num_tags , t2.id, t2.name, t2.num_tags STEP 2: 各要素計算(2つの商品のタグの積集合) t1 t2 id name tag_id tag_name num_tags 72 響 1 silver hair 2 72 響 3 serafuku 2 73 雷 2 brown hair 2 73 雷 3 serafuku 2 74 電 2 brown hair 2 74 電 3 serafuku 2 id name tag_id tag_name num_tags 72 響 1 silver hair 2 72 響 3 serafuku 2 73 雷 2 brown hair 2 73 雷 3 serafuku 2 74 電 2 brown hair 2 74 電 3 serafuku 2 105
  39. SELECT … , t1.num_tags AS n1 , t2.num_tags AS n2

    , COUNT(1) AS n12 FROM tag_set AS t1 JOIN tag_set AS t2 ON tag_id = tag_id WHERE t1.id <> t2.id GROUP BY t1.id, t1.name, t1.num_tags , t2.id, t2.name, t2.num_tags STEP 2: 各要素計算(2つの商品のタグの積集合) id name tag_id tag_name num_tags 72 響 1 silver hair 2 72 響 3 serafuku 2 73 雷 2 brown hair 2 73 雷 3 serafuku 2 74 電 2 brown hair 2 74 電 3 serafuku 2 t1 t2 id name tag_id tag_name num_tags 72 響 1 silver hair 2 72 響 3 serafuku 2 73 雷 2 brown hair 2 73 雷 3 serafuku 2 74 電 2 brown hair 2 74 電 3 serafuku 2 106
  40. STEP 2: 各要素計算(2つの商品のタグの積集合) id name tag_id tag_name num_tags 72 響

    1 silver hair 2 72 響 3 serafuku 2 73 雷 2 brown hair 2 73 雷 3 serafuku 2 74 電 2 brown hair 2 74 電 3 serafuku 2 id name tag_id tag_name num_tags 72 響 1 silver hair 2 72 響 3 serafuku 2 73 雷 2 brown hair 2 73 雷 3 serafuku 2 74 電 2 brown hair 2 74 電 3 serafuku 2 SELECT … , t1.num_tags AS n1 , t2.num_tags AS n2 , COUNT(1) AS n12 FROM tag_set AS t1 JOIN tag_set AS t2 ON tag_id = tag_id WHERE t1.id <> t2.id GROUP BY t1.id, t1.name, t1.num_tags , t2.id, t2.name, t2.num_tags t1 t2 107
  41. SELECT … , t1.num_tags AS n1 , t2.num_tags AS n2

    , COUNT(1) AS n12 FROM tag_set AS t1 JOIN tag_set AS t2 ON tag_id = tag_id WHERE t1.id <> t2.id GROUP BY t1.id, t1.name, t1.num_tags , t2.id, t2.name, t2.num_tags STEP 2: 各要素計算(2つの商品のタグの積集合) t1. id t1. name t1. tag _id t1. tag_name t1. num _tags t2. id t2. name t2. tag _id t2. num _tags 73 雷 2 brown hair 2 73 雷 2 2 73 雷 2 brown hair 2 74 電 2 2 73 雷 3 serafuku 2 72 響 3 2 73 雷 3 serafuku 2 73 雷 3 2 73 雷 3 serafuku 2 74 電 3 2 108
  42. SELECT … , t1.num_tags AS n1 , t2.num_tags AS n2

    , COUNT(1) AS n12 FROM tag_set AS t1 JOIN tag_set AS t2 ON tag_id = tag_id WHERE t1.id <> t2.id GROUP BY t1.id, t1.name, t1.num_tags , t2.id, t2.name, t2.num_tags STEP 2: 各要素計算(2つの商品のタグの積集合) t1. id t1. name t1. tag _id t1. tag_name t1. num _tags t2. id t2. name t2. tag _id t2. num _tags 73 雷 2 brown hair 2 73 雷 2 2 73 雷 2 brown hair 2 74 電 2 2 73 雷 3 serafuku 2 72 響 3 2 73 雷 3 serafuku 2 73 雷 3 2 73 雷 3 serafuku 2 74 電 3 2 109
  43. STEP 2: 各要素計算(2つの商品のタグの積集合) SELECT … , t1.num_tags AS n1 ,

    t2.num_tags AS n2 , COUNT(1) AS n12 FROM tag_set AS t1 JOIN tag_set AS t2 ON tag_id = tag_id WHERE t1.id <> t2.id GROUP BY t1.id, t1.name, t1.num_tags , t2.id, t2.name, t2.num_tags t1. id t1. name t1. tag _id t1. tag_name t1. num _tags t2. id t2. name t2. tag _id t2. num _tags 73 雷 2 brown hair 2 74 電 2 2 73 雷 3 serafuku 2 72 響 3 2 73 雷 3 serafuku 2 74 電 3 2 110
  44. STEP 2: 各要素計算(2つの商品のタグの積集合) SELECT … , t1.num_tags AS n1 ,

    t2.num_tags AS n2 , COUNT(1) AS n12 FROM tag_set AS t1 JOIN tag_set AS t2 ON tag_id = tag_id WHERE t1.id <> t2.id GROUP BY t1.id, t1.name, t1.num_tags , t2.id, t2.name, t2.num_tags t1. id t1. name t1. tag _id t1. tag_name t1. num _tags t2. id t2. name t2. tag _id t2. num _tags 73 雷 2 brown hair 2 74 電 2 2 73 雷 3 serafuku 2 72 響 3 2 73 雷 3 serafuku 2 74 電 3 2 111
  45. STEP 2: 各要素計算(2つの商品のタグの積集合) 73 雷 2 brown hair 2 74

    電 2 2 73 雷 3 serafuku 2 74 電 3 2 73 雷 3 serafuku 2 72 響 3 2 SELECT … , t1.num_tags AS n1 , t2.num_tags AS n2 , COUNT(1) AS n12 FROM tag_set AS t1 JOIN tag_set AS t2 ON tag_id = tag_id WHERE t1.id <> t2.id GROUP BY t1.id, t1.name, t1.num_tags , t2.id, t2.name, t2.num_tags t1. id t1. name t1. tag _id t1. tag_name t1. num _tags t2. id t2. name t2. tag _id t2. num _tags 112
  46. STEP 2: 各要素計算(2つの商品のタグの積集合) 73 雷 2 brown hair 2 74

    電 2 2 73 雷 3 serafuku 2 74 電 3 2 73 雷 3 serafuku 2 72 響 3 2 SELECT … , t1.num_tags AS n1 , t2.num_tags AS n2 , COUNT(1) AS n12 FROM tag_set AS t1 JOIN tag_set AS t2 ON tag_id = tag_id WHERE t1.id <> t2.id GROUP BY t1.id, t1.name, t1.num_tags , t2.id, t2.name, t2.num_tags t1. id t1. name t1. tag _id t1. tag_name t1. num _tags t2. id t2. name t2. tag _id t2. num _tags 1 2 113
  47. STEP 2: 各要素計算(2つの商品のタグの積集合) t1. id t1. name t1. num_ tags

    t2. id t2. name t2. num_ tags count 73 雷 2 74 電 2 2 73 雷 2 72 響 2 1 SELECT … , t1.num_tags AS n1 , t2.num_tags AS n2 , COUNT(1) AS n12 FROM tag_set AS t1 JOIN tag_set AS t2 ON tag_id = tag_id WHERE t1.id <> t2.id GROUP BY t1.id, t1.name, t1.num_tags , t2.id, t2.name, t2.num_tags 114 タグ数 積集合 タグ数
  48. STEP 2: 各要素計算(2つの商品のタグの積集合) t1. id t1. name n1 t2. id

    t2. name n2 n12 73 雷 2 74 電 2 2 73 雷 2 72 響 2 1 SELECT … , t1.num_tags AS n1 , t2.num_tags AS n2 , COUNT(1) AS n12 FROM tag_set AS t1 JOIN tag_set AS t2 ON tag_id = tag_id WHERE t1.id <> t2.id GROUP BY t1.id, t1.name, t1.num_tags , t2.id, t2.name, t2.num_tags 115 タグ数 積集合 タグ数
  49. STEP 3: ダイス係数計算+ランキング t1. id t1. name n1 t2. id

    t2. name n2 n12 73 雷 2 72 響 2 1 73 雷 2 74 電 2 2 ②要素を組み合わせ ROW_NUMBER() OVER(PARTITION BY t1.id ORDER BY 2 * n12 / (n1 + n2) DESC) 116
  50. ROW_NUMBER() OVER(PARTITION BY t1.id ORDER BY 2 * n12 /

    (n1 + n2) DESC) STEP 3: ダイス係数計算+ランキング id 毎に分割 t1. id t1. name n1 t2. id t2. name n2 n12 73 雷 2 72 響 2 1 73 雷 2 74 電 2 2 117
  51. ROW_NUMBER() OVER(PARTITION BY t1.id ORDER BY 2 * n12 /

    (n1 + n2) DESC) STEP 3: ダイス係数計算+ランキング ダイス係数計算 t1. id t1. name n1 t2. id t2. name n2 n12 n12 (n1 + n2) 73 雷 2 72 響 2 1 0.5 73 雷 2 74 電 2 2 1 118
  52. STEP 3: ダイス係数計算+ランキング ROW_NUMBER() OVER(PARTITION BY t1.id ORDER BY 2

    * n12 / (n1 + n2) DESC) 並び替え t1. id t1. name n1 t2. id t2. name n2 n12 n12 (n1 + n2) 73 雷 2 74 電 2 2 1 73 雷 2 72 響 2 1 0.5 119
  53. ROW_NUMBER() OVER(PARTITION BY t1.id ORDER BY 2 * n12 /

    (n1 + n2) DESC) STEP 3: ダイス係数計算+ランキング ランク付け ROW_ NUMBER t1. id t1. name n1 t2. id t2. name n2 n12 n12 (n1 + n2) 1 73 雷 2 74 電 2 2 1 2 73 雷 2 72 響 2 1 0.5 120
  54. ダイス係数計算 tag_id tag name score 1 silver hair 0.89 3

    serafuku 0.82 tag_id tag name score 2 brown hair 0.96 3 serafuku 0.87 tag_id tag name score 2 brown hair 0.97 3 serafuku 0.59 似てない 似てる 50% 100% 72. 響 73. 雷 74. 電 タグ情報 121
  55. まとめ Deep Learning の利用ハードルはそれほど高くない SQL on Hadoop + Deep Learning

    Tool の活用 • モデルから得られた特徴量から SQL(UDF) を用いて 容易に類似度算出が可能 133
  56. まとめ Deep Learning の利用ハードルはそれほど高くない 類似画像レコメンドの実現 SQL on Hadoop + Deep

    Learning Tool の活用 • 学習済みモデル (Illustlation2Vec) と自作モデルで 画像特徴を抽出 • SQL(+ UDF) により自作 API から画像特徴を取得 • SQL により類似度を算出 -> レコメンド 134