会員数3億人、商品数4億点、大規模電子商取引の商品推奨にディープラーニングを応用!

会員数3億人、商品数4億点、大規模電子商取引の商品推奨にディープラーニングを応用!

電子商取引業界では、ユーザーに対する商品の推奨は常に非常にホットで重要なトピックです。比較的成熟した方法は数多くありますが、それぞれに長所と短所があります。

[[202807]]

共通アルゴリズムルーチン

電子商取引の製品推奨によく使われるアルゴリズムは次のとおりです。

製品の類似性に基づく

たとえば、食品 A と食品 B の類似性は、価格、味、賞味期限、ブランドなどの要素に基づいて計算できます。蒸しパンを買うときに、ついでに餃子も一箱買って帰ることも考えられます。

メリット:コールドスタート:製品データがあれば、ユーザーデータがあまりないビジネスの初期段階でもレコメンデーションを行うことができます。

デメリット:前処理が複雑です。どの製品でも、寸法は少なくとも数百になることがあります。計算に適切な寸法を選択するには、お金では買えないエンジニアリングの経験が必要です。

典型的な例: Amazon の早期推奨システム。

相関ルールに基づく

最も一般的な方法は、ユーザーの購買習慣を利用することです。典型的なケースは「ビールおむつ」のケースですが、この方法は実際の運用ではあまり使用されていません。

まず、相関ルールを作成する必要があります。データの量は十分でなければなりません。そうでないと、信頼度が低くなりすぎます。データ量が増えると、より優れた方法がありますが、ハイライトがないと言えます。業界のアルゴリズムには、apriori、ftgrowなどがあります。

利点:シンプルで操作が簡単で、すぐに開始でき、導入が非常に便利です。

欠点:より多くのデータが必要であり、精度は平均的です。

典型的:初期のオペレーターからのパッケージの推奨事項。

アイテムベースの共同推奨

商品 A は Xiao Zhang、Xiao Ming、Xiao Dong が購入し、商品 B は Xiao Hong、Xiao Li、Xiao Chen が購入し、商品 C は Xiao Zhang、Xiao Ming、Xiao Li が購入したとします。

直感的に、商品 A と商品 C の購入グループは (商品 B と比較して) より類似しています。これで、商品 C を Xiao Dong に、商品 A を Xiao Li に推奨できます。この推奨アルゴリズムは比較的成熟しており、多くの企業で使用されています。

利点:比較的正確で、結果の解釈性が高く、副産物を使用して製品の人気ランキングを導き出すことができます。

デメリット:計算が複雑、データ保存のボトルネック、人気のないアイテムの推奨効果が低い。

典型例: No.1 ストアでの早期製品推奨。

ユーザーベースの共同推奨

ユーザー A がコカコーラ、スプライト、鍋の素を購入し、ユーザー B がトイレットペーパー、衣服、靴を購入し、ユーザー C が鍋、ジュース、セブンアップを購入したとします。

直感的に、ユーザー A とユーザー C は (ユーザー B に比べて) より類似しています。これで、ユーザー C が購入した他のアイテムをユーザー A に推奨したり、ユーザー A が購入した他のアイテムをユーザー C に推奨したりすることができます。利点と欠点は、重複のないアイテムベースの共同推奨と同様です。

モデルベースの推奨

SVD+、固有値分解などにより、ユーザーの購買行動行列を 2 セットの重み行列の積に分割します。1 セットの行列はユーザ​​ーの行動特性を表し、もう 1 セットの行列は製品の重要度を表します。ユーザー推奨プロセスでは、ユーザーの過去のトレーニング マトリックスに基づいて各製品の可能性を計算して推奨します。

利点:正確で、人気のない商品に対する推奨効果が非常に優れています。

デメリット:計算量が非常に大きく、行列分割の効率と容量のボトルネックが常に制約されていました。

標準: HP コンピュータの推奨事項。

時間ベースの推奨事項

これはかなり特殊で、電子商取引ではほとんど使用されませんが、Twitter、Facebook、Doubanでよく使用されます。承認と不承認しかない場合にコメントを並べ替える方法に関するものです。

ディープラーニングに基づく推奨

上記で推奨した例では、現在普及している CNN (畳み込みニューラル ネットワーク)、RNN (再帰型ニューラル ネットワーク)、DNN (ディープ ニューラル ネットワーク) が使用されていますが、これらはまだ実験段階です。 word2vec をベースにした比較的成熟した方法があり、これも今日の紹介の焦点です。

利点:推奨効果は非常に正確で、必要な基本ストレージ リソースが少なくなります。

デメリット:エンジニアリングアプリケーションが未熟であり、モデルのトレーニングとパラメータ調整技術が困難です。

典型例: Suning.com のメンバー製品推奨事項。

item2vec プロジェクトの紹介

Suning は現在、約 4 億点の商品、10,000 以上のカテゴリ、約 40 の主要カテゴリを保有しています。従来の共同推奨とリアルタイム計算を使用すると、サーバーのコストと計算能力が大幅に制限されます。

メンバーのR&D部門は主な推奨アプリケーション部門ではないため、より効率的で高速で比較的正確な、よりシンプルなモデルを選択することが予想されます。そのため、元のword2vecアルゴリズムに基づいてitemNvecメソッドを模倣しました。

まず、itemNvec を理論的に分解してみましょう。

01.パート1: n-gram

対象製品に対する前後の製品の影響度

これは、Yigoo における 2 人のユーザー、userA と userB の消費タイムラインです。灰色のボックスが観察対象です。灰色のボックス内で userA と userB の購入アイテムを変更した場合、直感的にわかる可能性はどの程度でしょうか。

直感的な経験から、これは不可能であるか、または決して頻繁に起こることではないことがわかります。したがって、特定のカテゴリの特定のユーザーについては、その消費行動が継続的に影響を受けるという最初の仮定があります。

言い換えれば、私が何を買うかは、以前に何を買ったかによって決まります。上記をアルゴリズム言語で説明するにはどうすればよいでしょうか。ナイーブベイズがスパムメールをどのように分類したかを思い出してみましょう。

「弊社では請求書、武器販売、航空母艦整備等も承っております」という文章はスパムでしょうか?

  • P1(「スパム」|「当社は請求書、武器販売、航空母艦のメンテナンスを提供できます」)
  • =p("spam")p("弊社は請求書、武器販売、航空母艦のメンテナンスを提供できます"/"spam")/p("弊社は請求書、武器販売、航空母艦のメンテナンスを提供できます")
  • =p("スパム")p("請求書","武器","航空母艦"/"スパム")/p("請求書","武器","航空母艦")

同じ理由

  • P2(「通常のメール」|「当社は請求書、武器販売、航空母艦のメンテナンスを提供できます」)
  • =p("通常郵便")p("請求書", "武器", "航空母艦"/"通常郵便")/p("請求書", "武器", "航空母艦")

p1 と p2 のサイズを比較するだけで、次のように直接記述できます。

  • P1(「スパム」|「当社は請求書、武器販売、航空母艦のメンテナンスを提供できます」)
  • =p("スパム")p("請求書"/"スパム")p("武器"/"スパム")p("航空母艦"/"スパム")
  • P2(「通常のメール」|「当社は請求書、武器販売、航空母艦のメンテナンスを提供できます」)
  • =p("通常郵便")p("請求書"/"通常郵便")p("武器"/"通常郵便")p("航空母艦"/"通常郵便")

しかし、「当社は請求書、武器販売、航空母艦整備などに対応できます」という文言の順序がどのように変わっても、最終結果には影響しません。ただし、需要の早い段階で購入したものは、後の項目に大きな影響を与えます。

冷蔵庫=>洗濯機=>ワードローブ=>テレビ=>ソーダ、この注文プロセスは合理的です。

冷蔵庫 => 洗濯機 => ソーダ => テレビ => ワードローブ、このような順序付けのプロセスは比較的起こりにくいです。

しかし、ナイーブベイズの場合、それらは一貫しています。したがって、ここで検討する順序は、依然として前述のスパムの問題です。

  • P1(「スパム」|「当社は請求書、武器販売、航空母艦のメンテナンスを提供できます」)
  • =p("スパム")p("請求書")p("武器"/"請求書")p("武器"/"航空母艦")
  • P1(「通常のメール」|「当社は請求書、武器販売、航空母艦のメンテナンスを提供できます」)
  • =p("通常郵便")p("請求書")p("武器"/"請求書")p("武器"/"航空母艦")

ここでは、各単語は前の単語にのみ依存します。理論的には、1〜3 個の単語に依存することは通常許容されます。

前述のシーケンシャル ベイズは、有名なマルコフ仮定に基づいています。つまり、次の単語の出現は、その前の 1 つ以上の単語の結合確率のみに依存します。関連する詳細な理論的な数式はここでは示しませんが、ここにはアイデアが含まれています。

02. パート2: ハフマン符号化

より大規模なデータストレージ

私たちがよく使用するユーザーとアイテムのマッピングは、ワンホットエンコーディングの形式で実装されていますが、これには、データストレージ係数と次元障害の可能性が非常に高いという大きな欠点があります。

元のデータに戻りましょう。現在、Suning には約 4 億点の製品、10,000 を超える製品カテゴリ、約 40 の主要カテゴリがあり、会員数は 3 億人に達しています。

ユーザーベースの共同推奨のために、ユーザー製品に対応する購入関係マトリックスを構築する必要がある場合、4 億 x 6 億の 1/0 マトリックスを作成する必要がありますが、これはほぼ不可能です。Huffman は、ストレージに近似バイナリ ツリーの形式を使用します。

Yiguo 製品の購入金額を例に、ワンホットエンコーディングストレージ方式をバイナリツリーに置き換える方法を説明します。

仮定

818蘇寧のプロモーション期間中、統計によると、冷蔵庫=>洗濯機=>乾燥機=>テレビ=>ワードローブ=>ダイヤモンド(購入順序は上記の通り)というユーザーの注文チェーンがあり、そのうち冷蔵庫が15万台、洗濯機が8万台、乾燥機が6万台、テレビが5万台、ワードローブが3万台、ダイヤモンドが1万個販売されました。

ハフマン木の構築プロセス:

  • バイナリ ツリーのノードとして {15,8,6,5,3,1} が指定されている場合、各ツリーには 1 つのノードのみが含まれるため、6 つの個別のツリーが存在します。
  • マージするノードの重み値が最小の 2 つのツリー、つまり {3} と {1} を選択し、マージ後の新しい重み 3+1=4 を計算します。
  • ノード リストから {3}、{1} ツリーを削除し、3+1=4 の新しい結合ツリーを元のノード リストに戻します。
  • 木が 1 本だけ残るまで 2 ~ 3 回繰り返します。

各層の各分岐プロセスでは、重みの大きいノードを 1 と見なし、重みの小さいノードを 0 と見なすことができます。その逆も同様です。

たとえば、ダイヤモンドのコードは 1000 で、灰色のボックスの場所であり、洗濯機のコードは 111 であることを知っておく必要があります。

このタイプのストレージは、0/1 ストレージ方式を利用し、組み合わせ位置の配置長さも考慮して、データ ストレージ スペースを節約します。

03. パート3: ノード確率

現在のデータの確率密度関数を最大化する

ダイヤモンドの位置の場合、ハフマン コードは 1000 です。つまり、各バイナリ選択で、1 に 1 回、0 に 3 回割り当てる必要があります。

さらに、各分類プロセスでは、1/0 のみを選択できます。これは、ロジスティック回帰の 0/1 分類に似ていますか? したがって、lr のクロスエントロピーを損失関数として直接使用します。

実際、多くの機械学習アルゴリズムでは、まずモデルを想定し、次に損失関数を構築し、データを使用して損失関数をトレーニングして argmin (損失関数) のパラメータを見つけ、それを元のモデルに戻します。

このダイヤモンドの例を詳しく見てみましょう。

ステップ1: p(1|第1層の未知のパラメータ)=シグモイド(第1層の未知のパラメータ)

ステップ2: p(0|第2層の未知のパラメータ)=シグモイド(第2層の未知のパラメータ)

同様に、3 番目と 4 番目のレイヤーは次のようになります。

  • p(0|第3層の未知のパラメータ)=シグモイド(第3層の未知のパラメータ)
  • p(0|第4層の未知のパラメータ)=シグモイド(第4層の未知のパラメータ)

そして、p(1|第1層の未知のパラメータ)、xp(0|第2層の未知のパラメータ)、xp(0|第3層の未知のパラメータ)、およびxp(0|第4層の未知のパラメータ)が最大になるとき、各層の未知のパラメータを見つけることができます。

このソリューションは、未知のパラメータ分布の偏微分とそれに続く勾配降下法を伴うロジスティックソリューションに似ています。 (非常に大規模なバッチ、ニュートンをオンデマンドで使用)

04. パート4: 近似ニューラルネットワーク

製品の類似性

パート3では、p(1|第1層の未知のパラメータ)のロジックがあります。第1層の未知のパラメータの1つは、積ベクトルです。

例えば:

「ビール=>スイカ=>カミソリ=>ペプシ」の順番で商品を購入したユーザーが1000万人いる。

100,000 人のユーザーが「ビール => リンゴ => カミソリ => ペプシ」という順序で商品を購入しました。ネイビー ベイズや n-gram などの従来の確率モデルを使用すると、この順序がわかります。

P(ビール=>スイカ=>カミソリ=>ペプシ)>>p(ビール=>リンゴ=>カミソリ=>ペプシ)ですが、実際には、2つのグループは同じグループであり、その属性特性は同じである必要があります。

各製品の特徴ベクトルをランダムに初期化し、パート 3 の確率モデルを通じてトレーニングし、最後に単語ベクトルのサイズを決定します。さらに、これはニューラル ネットワーク アルゴリズムを通じて実行することもできます。

Bengio らは、2001 年に NIPS に発表された論文「A Neural Probabilistic Language Model」で詳細な手法を紹介しました。

ここで知っておく必要があるのは、最小次元の積について、0-1 点 (0、0、0、0、0、1、0、0、0、0、0...) を積ベクトル (0.8213、0.8232、0.6613、0.1234、...) に置き換えたということです。単一の積ベクトルは意味がありません。

しかし、対積ベクトルの場合は、コサイン類似度を比較したり、カテゴリの類似度を比較したり、さらにはカテゴリの類似度を比較したりすることもできます。

Pythonコードの実装

01. データの読み取り

  1. # -*- コーディング:utf-8 -*-
  2. pandasをpdとしてインポートする
  3. numpyをnpとしてインポートする
  4. matplotlib をmtとしてインポートします
  5. gensim.modelsからword2vecをインポートする
  6. sklearn.model_selectionからtrain_test_split をインポートします
  7.  
  8. order_data = pd.read_table( 'C:/Users/17031877/Desktop/SuNing/cross_sell_data_tmp1.txt' )
  9. dealed_data = order_data.drop ( 'member_id' 、axis=1 )
  10. 処理されたデータ = pd.DataFrame(処理されたデータ).fillna(値 = '' )

02. シンプルなデータの結合と並べ替え

  1. # データの結合
  2. dealed_data = dealed_data[ 'top10' ] + [ " " ] + dealed_data[ 'top9' ] + [ " " ] + dealed_data[ 'top8' ] + [ " " ] + \
  3. 取引データ[ 'top7' ] + [ " " ] + 取引データ[ 'top6' ] + [ " " ] + 取引データ[ 'top5' ] + [ " " ] + 取引データ[
  4. 'top4' ] + [ " " ] + 取引データ[ 'top3' ] + [ " " ] + 取引データ[ 'top2' ] + [ " " ] + 取引データ[ 'top1' ]
  5.  
  6. # データ列
  7. dealed_data = [s.encode( 'utf-8' ).split()で、dealed_data内のs を分割します]
  8.  
  9. # データ分割
  10. train_data、test_data = train_test_split(dealed_data、test_size=0.3、random_state=42) です。

03. モデルのトレーニング

  1. # オリジナルデータのトレーニング
  2. # sg=1,スキップグラム;sg=0,SBOW
  3. # hs=1:階層的ソフトマックス、ハフマンツリー
  4. # 負 = 0 非負サンプリング
  5. モデル = word2vec.Word2Vec(train_data、sg=1、min_count=10、window=2、hs=1、negative=0)

次のステップは、モデルを使用して推奨製品をトレーニングすることです。ここでは、特定のビジネス ニーズと実際のデータ量に基づいて選択できる 3 つのアプローチがあります。

類似製品マッピング表

  1. # 最後に閲覧した商品に最も類似した上位 3 つの商品グループ
  2. x = 1000
  3. 結果 = []
  4. 結果 = pd.DataFrame(結果)
  5. iが範囲(x)場合:
  6. test_data_split = [s.encode( 'utf-8' ).split() をtest_data[i]内のsに対して実行します
  7. k = len(テストデータ分割)
  8. 最後の1つ = テストデータ分割[k - 1]
  9. last_one_recommended = model.most_similar(last_one, topn=3)
  10. tmp = 最後の1つ推奨[0] + 最後の1つ推奨[1] + 最後の1つ推奨[2]
  11. last_one_recommended = pd.concat([pd.DataFrame(last_one), pd.DataFrame(np.array(tmp))], axis=0)
  12. 最後の1つを推奨 = 最後の1つを推奨.T
  13. 結果 = pd.concat([pd.DataFrame(last_one_recommended), 結果], 軸=0)

ユーザーが最後の操作で注目したアイテム x を考慮し、ユーザーが購入したアイテムを除外します。残りのアイテムは、ユーザーがまだ興味を持っているが、適切なアイテムや安価なアイテムを見つけられていないアイテムを表します。アイテム ベクトル間の類似性を通じて、類似性の高いアイテムを直接計算し、ユーザーに推奨することができます。

最大購入可能額

ユーザーが過去に購入したアイテムの順序に基づいて、現在のターゲット ユーザーが最近購入したアイテムに基づいて次に購入する可能性が高いものを特定します。

たとえば、過去のデータから、携帯電話とコンピュータを購入したユーザーは、今後 1 週間以内にバックパックを購入する可能性が最も高いことがわかります。この場合、最近コンピュータと携帯電話を購入したユーザーにコンピュータ バッグ製品をプッシュして、潜在的なショッピング ニーズを刺激することができます。

  1. # ベクターライブラリ
  2. rbind_data = pd.concat(
  3. [order_data[ 'top1' ], order_data[ 'top2' ], order_data[ 'top3' ], order_data[ 'top4' ], order_data[ 'top5' ],
  4. order_data[ 'top6' ]、order_data[ 'top7' ]、order_data[ 'top8' ]、order_data[ 'top9' ]、order_data[ 'top10' ]]、axis=0)
  5. x = 50
  6. 開始 = []
  7. 出力= []
  8. スコア_最終 = []
  9. iが範囲(x)場合:
  10. スコア = np.array(-1000000000000000)
  11. 名前= np.array(-1000000000000000)
  12. ニューススコア = np.array(-1000000000000000)
  13. tmp = テストデータ[i]
  14. k = 長さ(tmp)
  15. 最後の1つ = tmp[k - 2]
  16. tmp = tmp[0:(k - 1)]
  17. jが範囲(数値)の場合:
  18. tmp1 = tmp[:]
  19. ターゲット = rbind_data_level[j]
  20. tmp1.append(ターゲット)
  21. テストデータ分割 = [tmp1]
  22. ニューススコア = model.score(test_data_split)
  23. ニューススコア > スコアの場合:
  24. スコア = ニューススコア
  25. 名前= tmp1[長さ(tmp1) - 1]
  26. それ以外
  27. 合格
  28. start.append(最後の1つ)
  29. 出力.append(名前)
  30. score_final.append(スコア)

Lenovo メモリの推奨事項

最も購入される可能性が高い商品の中から、ユーザーの最近の購入行動のパターンと過去のユーザーの購入行動データを特定し、おすすめの商品を提供します。

同様のロジックがもう 1 つあり、以下に示すように、過去のユーザーの単一の購入に関するデータを参照して、対象ユーザーの最新の商品購入に基づいて推論を行うというものです。

この実装も非常にシンプルです。自分でコードを書いたわけではないので、ここでは掲載しません。それでも、word2vec のpredict_output_word(context_words_list, topn=10)を使用し、コンテキスト単語をトレーニング済みモデルへの入力として与えられた中心単語の確率分布を報告します。

上記は詳細に実装するのは非常に複雑なので、参考と実践のためにいくつかのアイデアを掲載しました。

<<:  畳み込みニューラルネットワークによる画像認識の仕組み

>>:  今後10年間で、人工知能とロボットは雇用に7つの影響を与える

ブログ    
ブログ    
ブログ    

推薦する

...

...

冬季オリンピックの AI: 氷と雪の世界における 5 つの「テクノロジーの花」

2022年2月4日、第24回冬季オリンピックが北京で正式に開幕しました。 2008年の「一つの夢」...

ロボット開発で人気の言語:不滅のJava、不滅のC/C++、そして新興のPython

プログラミング言語は流行ったり廃れたりするものですが、Java と C/C++ は変わりません。 [...

...

Omdia: 2024 年に注目すべき主要な AI トレンド

生成型 AI が人間と機械のコミュニケーション方法を変えるため、今年は人工知能にとって極めて重要な年...

プライバシー情報セキュリティに注意を払い、顔認識の数十億ドル規模のブルーオーシャンを開拓しましょう

近年、人工知能の継続的な発展とインテリジェント時代の静かな到来に伴い、顔認識に代表される生体認証技術...

「理解する」シナリオ + 「理解する」テクノロジー: スマート交通で旅行が予測可能になる

【51CTO.comオリジナル記事】 [[337243]]よくよく数えてみると、一般的に誰もが悩まさ...

あなたの AI は規制に対応できる準備ができていますか?

現在、人工知能 (AI) に関する同様の規制が世界中の複数の地域で施行され始めており、GDPR に関...

ファーウェイのロボット犬が公開:AI技術を使用して動的なマルチターゲット追跡と追従を実現

ロボット界のインターネット有名人といえば、ボストン・ロボット・ドッグを挙げなければなりません。そして...

人工知能に必要な3つの条件

人工知能に必要な条件:ディープラーニングモデル、ビッグデータ、計算能力著者: マイケル・チャン201...

重力波検出からRNAシークエンシングまで、AIが科学的発見を加速させる方法

[[433235]]この記事はLeiphone.comから転載したものです。転載する場合は、Leip...

長いテキストの復号化畳み込みニューラルネットワークアーキテクチャ

導入まず正直に言うと、しばらくの間、私はディープラーニングをあまり理解できませんでした。関連する研究...

信頼できる GNN を構築するにはどうすればよいでしょうか?最新のレビューはコチラ!信頼できるグラフニューラルネットワーク: 次元、方法、傾向

序文ここ数年、ニューラルネットワークを中心とした人工知能技術は、さまざまな種類のデータを深く掘り下げ...

人工知能は偏見を排除するのに役立ちますか?

「私たちは物事をあるがままに見ているのではなく、私たちが見ているように見ているのです。」彼女は、私...