跳轉到主要內容
工程的博客

建立一個圖像相似性對電子商務推薦係統

2022年3月1日 機器學習

分享這篇文章

推薦係統為什麼重要

網上購物已經成為默認的經驗對普通消費者,甚至建立實體零售商接受電子商務。為了確保流暢的用戶體驗,需要考慮多種因素對電子商務。一個核心功能,已被證明改善用戶體驗,因此在線零售商的收入,是一個產品推薦係統。在這個時代,它幾乎不可能去一個網站消費者並沒有看到產品的建議。

但不是所有的推薦係統都是平等的,他們也不應該。不同的購物經曆需要不同的數據提出建議。吸引顧客的個性化體驗需要多種形式的數據和推薦方法。最推薦係統關心培訓機器學習模型在用戶和產品屬性數據表格形式的按摩。

有一個指數增加體積和各種數據在我們處理構建推薦係統和顯著的進步過程中利用計算和算法。特別是存儲的方法,過程和學習圖像數據在過去的幾年中顯著增加。這允許零售商超越簡單的協同過濾算法和利用更複雜的方法,如圖像分類和深卷積神經網絡,可beplay娱乐ios以考慮視覺相似的物品作為輸入進行推薦。這是特別重要的網上購物是一種主要的視覺體驗和許多消費品是美學。

在本文中,我們將更改腳本和端到端流程的培訓和部署一個基於圖像的相似性模型,可以作為推薦係統的基礎。此外,我們將展示如何底層分布式計算中可用數據磚可以幫助規模的培訓流程和基本組件如何Lakehouse,三角洲湖和MLflow,可以使這個過程簡單、重現性好。

為什麼相似的學習呢?

相似模型訓練使用對比學習。在對比學習,目的是使機器學習(ML)模型學習一個嵌入空間中類似的物品之間的距離最小化和不同項目之間的距離最大化。在這裏,我們將使用時尚MNIST數據集,包括大約70000圖像的各種服裝。基於上述描述,相似性模型訓練在這個標簽數據集將學習的嵌入空間中嵌入的類似產品(例如,靴子,更接近在一起,不同的物品例如,靴子和套頭毛衣)相距遠。在監督對比學習,該算法獲取元數據,如圖像標簽,學習,除了原始像素數據本身。

這可能說明如下。

圖像描述了類似的物品如何位於靠近,遠離向量空間中不同的項目

傳統ML模式圖像分類重點針對最大化減少損失函數的概率預測類。然而,一個推薦係統從根本上試圖做什麼建議替代一個給定的項目。這些物品可以被描述為彼此接近某些嵌入空間。因此,在大多數情況下,推薦係統的工作原理緊密結合,對比學習機製相比,傳統的監督學習。此外,相似性模型更善於概括看不見的數據,根據他們的相似之處。例如,如果最初的訓練數據不包含任何圖像夾克但包含圖像的連帽衫和靴子,相似性模型訓練數據將定位圖像的嵌入的夾克更接近的連帽衫和遠離靴子。這是世界上非常強大的推薦方法。

具體來說,我們使用Tensorflow相似圖書館訓練模型和Apache火花,加上Horovod GPU集群規模模型的訓練。我們使用Hyperopt hyperparameter搜索整個GPU集群規模與火花隻有幾行代碼。所有這些實驗將與MLflow跟蹤和記錄保存模型譜係和再現性。三角洲將被用作數據源格式跟蹤數據沿襲。

設置環境

supervised_hello_world例子Tensorflow相似的Github庫提供了一個完美的模板用於手頭的任務。推薦我們試圖做的是類似的方式表現相似模型。,你選擇一個項目的形象,你查詢模型返回n最相似的東西也能激起您的興趣。

充分利用數據磚平台,最好是自旋與GPU集群節點的司機(因為我們將做Beplay体育安卓版本一些單節點最初訓練),兩個或兩個以上的GPU工人節點(我們將擴展hyperparameter優化和分發培訓本身),和一個磚機器學習運行時的10.0或以上。T4 GPU實例這個練習是一個很好的選擇。

被選中的圖像顯示了配置創建一個集群GPU的工作描述。T4 gpu司機和兩個工人是一個很好的選擇節點

整個過程應該不超過5分鍾(包括集群自旋向上時)。

數據攝取到三角洲表

時尚MNIST訓練和測試數據可以導入到我們的環境使用一係列簡單的shell命令和輔助函數“轉換”(原始版本的修改:https://pjreddie.com/projects/mnist-in-csv/”(減少不必要的文件I / O)可用於圖像和標簽文件轉換為表格格式。隨後這些表可以存儲為三角洲表。

將訓練和測試數據存儲為三角洲表很重要,當我們逐步編寫新的觀測這些表(新圖片和標簽),δ事務日誌可以跟蹤更改數據。這使我們能夠跟蹤新鮮數據我們可以使用索引數據在相似性指數稍後我們將描述。

訓練相似模型的細微差別

神經網絡用於火車相似模型非常類似於一個用於定期監督學習。損失函數的主要差別是我們使用和度量嵌入層。這裏我們使用一個簡單的卷積神經網絡(cnn)的架構,這是常見的計算機視覺的應用程序。然而,在代碼中有細微的差別,使模型學習使用對比的方法。

你會看到多相似損失函數代替將softmax損失函數為多級分類否則你會看到。相對於其他傳統的損失函數用於對比學習,Multi-Similarity損失考慮多個相似之處。這些相似之處是自相似,正麵相對的相似性,負相對相似。Multi-similarity損失措施這三個相似性通過迭代硬對礦業和權重,在對比學習任務帶來顯著的性能提升。進一步的細節終於在討論這個特定的損失最初的發布王et al

在這個例子中,這有助於最小化損失之間的距離相似的物品和嵌入空間中不同項目之間的距離最大化。supervised_hello_world例子的解釋Tensorflow_Similarity存儲庫嵌入層添加到模型中,MetricEmbedding()是一個致密層與L2正常化。對於每個minibatch,固定數量的嵌入(對應於圖像)是隨機選擇從隨機抽樣類(類的數量是一個超參數)。然後受到困難對礦業和加權迭代Multi-Similarity損失層,從三種不同類型的相似之處,信息是用來懲罰接近更多不同的樣品。

這下麵可以看到。

' ' 'defget_model():tensorflow_similarity.layers進口MetricEmbeddingtensorflow.keras進口tensorflow_similarity.models進口SimilarityModel輸入= layers.Input(形狀= (28,28,1))x = layers.experimental.preprocessing.Rescaling (1/255年)(輸入)x = layers.Conv2D (32,3激活=“relu”)(x)x = layers.MaxPool2D (2,2)(x)x = layers.Dropout (0.3)(x)x = layers.Dropout (0.3)(x)x = layers.Flatten () (x)輸出= MetricEmbedding (128年)(x)返回SimilarityModel(輸入、輸出)
              損失= MultiSimilarityLoss(距離=距離)模型。編譯(優化器=亞當(learning_rate),損失=損失)
              ' ' '

理解是很重要的一個訓練有素的相似性模型函數TensorFlow相似。模型的訓練期間,我們明白了嵌入的最小化之間的距離相似的物品。索引器的類庫提供的能力構建索引從這些嵌入的基礎上選擇距離度量。例如,如果選擇距離度量是餘弦,該指數將建在餘弦相似性的基礎。

該指數存在與“關閉”嵌入快速找到物品。對於這個快速搜索,檢索最類似的項目相對較低的延遲。這裏的查詢方法使用快速近似最近鄰搜索來檢索n最近的鄰居一個給定的項目,然後我們可以作為建議。

' ' '#使用訓練數據構建索引x_index y_index = select_examples (x_train y_train,類,20.)tfsim_model.reset_index ()tfsim_model。在dex(x_index, y_index, data=x_index)#查詢索引使用查找方法tfsim_model。查找(x_display k =5)' ' '

利用並行性與Apache火花

這個模型可以被訓練在一個節點沒有問題,我們可以建立一個索引來查詢。隨後的訓練模型可以查詢通過部署REST端點MLflow的幫助下。這尤其有意義,因為這個示例中使用的數據集時尚MNIST很小,適合在一個GPU實例的內存容易啟用。然而,在實踐中,圖像數據集的產品可以跨幾個字節大小。同時,即使對一個模型訓練的小數據集,發現的過程模型的最優hyperparameters可以是一個非常耗時的過程如果做一個GPU實例啟用。在這兩種情況下,並行通過火花隻能創造奇跡通過更改幾行代碼。

並行hyperparameter優化與Apache火花

在神經網絡的情況下,你能想到的人工神經元的權重參數更新在訓練。這是由梯度下降法和誤差反向傳播的手段。然而,價值觀如層數、每層的神經元數,甚至在神經元激活函數並不在這個過程進行了優化。這些是稱為hyperparameters,我們要搜索所有這些可能的hyperparameter組合的空間在一個聰明的方式來進行建模的過程。

傳統模型調優(簡稱hyperparameter搜索)可以用幼稚的方法如一個詳盡的網格搜索或一個隨機搜索。Hyperopt,廣泛采用開源框架模型調優,利用貝葉斯搜索這個過程更加高效。

這個搜索可以耗費時間,甚至與貝葉斯等智能算法搜索。然而,火花可以結合Hyperopt整個集群並行化這一過程導致一個戲劇性的減少時間消耗。必須做的一切來執行這個比例是添加2行python代碼與Hyepropt你通常會使用。注意並行性參數設置為2,(即集群gpu)的數量。

' '從hyperopt進口SparkTrials試驗= SparkTrials(並行= 2)best_params = fmin (fn = train_hyperopt,空間=空間,算法=算法,max_evals = 32,試驗=試驗)' '

這種並行工作的機製可以說明如下。

圖片描述了hyperopt在高水平的工作。Hyperopt分布尋找最優貝葉斯hyperparameters跨集群。

這篇文章在Python擴展Hyperopt調整機器學習模型給一個優秀的深潛水這是如何工作的。使用GPU啟用節點是非常重要的對於這一過程的相似性模型,特別是在這個例子利用Tensorflow。可以否定任何時間節省不必要的長時間和低效培訓流程利用CPU節點。提供一個詳細的分析文章

與Horovod並行模型的訓練

正如我們在前一節中,看到Hyperopt利用火花分發hyperparameter搜索通過訓練多個模型與不同hyperparameter組合,並行執行。每個模型的訓練發生在一個單獨的機器中。分布式模型訓練是另一種方法,分布式處理與火花能使訓練過程更有效率。在這裏,一個集群中的模型訓練在許多機器。

如果訓練數據集很大,可能是另一個瓶頸培訓生產準備相似模型。一些方法,這包括培訓模型隻在單個機器上數據的一個子集。這最後的成本模型是次優的。然而,火花和Horovod開源框架的並行模型訓練過程在一個集群,這個問題可以得到解決。Horovod,結合火花,提供了一種方式來表述數據並行處理模型訓練方法在大規模數據集用最少的代碼更改。這裏,並行模型訓練在集群中的每個節點子集的定義的數據傳遞,學習神經網絡的權值。這些重量是跨集群同步導致最終的模型。最終,你最終得到的一個高度優化的模型訓練在整個數據集上的一小部分時間內你會花在單個機器上試圖這樣做。這篇文章(不)如何規模深度學習在6簡單的步驟進入偉大的細節如何利用分布式計算深度學習。再次,Horovod在使用時是最有效的GPU集群。否則跨集群擴展模型訓練的優勢不會帶來預期的效率。

圖片描述了Horovod在高水平的工作。單個模型訓練在整個集群。

處理大圖像數據集模型訓練是另一個需要考慮的重要因素。在這個例子中,時尚MNIST是一個非常小的數據集,不應變集群。然而,大型圖像數據集通常出現在企業和一個用例可能涉及培訓相似模型等數據。在這裏,Petastorm,數據緩存庫建立與深度學習,將會非常有用。鏈接筆記本將幫助您利用這個技術,你的用例。

部署模型和指數

一旦最終模型最優hyperparameters訓練,部署的過程是一個微妙的相似模型。這是因為模型和指數需要部署在一起。然而,隨著MLflow,這個過程是非常簡單的。如前所述,建議通過查詢索引檢索的數據嵌入推斷從查詢樣本。這可以簡化的方式說明如下。

推薦係統包括圖像嵌入的訓練有素的相似性模型和指數。生成的建議,隨後圖像嵌入由模型生成和查詢索引中。

這種方法的主要優點之一就是不需要再培訓模型作為新的接收圖像數據。可以生成嵌入與模型並添加到安索引查詢。自從在三角洲地區的原始圖像數據格式,任何增量表將被記錄三角洲事務日誌。這樣可以確保整個數據攝入過程的再現性。

MLflow,有許多模型口味受歡迎(甚至模糊)毫升的模型框架,使簡單的包裝服務。在實踐中,有許多例子訓練模型與之前的部署和/或處理邏輯,比如安query-able相似性模型和指數。我們可以使用mlflow.pyfunc模塊創建一個自定義的推薦模型類(命名TfsimWrapper在這種情況下)封裝邏輯推理和查找。這鏈接提供了詳細的文檔就可以做到這一點。

' ' '進口mlflow.pyfuncTfsimWrapper(mlflow.pyfunc.PythonModel):”“”模式輸入一行,單柱熊貓dataframe base64編碼的字節字符串即類型的字節。列的名字是“輸入”在這種情況下”“””“輸出”模式是一個熊貓dataframe,每一行(即。元素隻有一列)是一個字符串轉換為十六進製,必須轉換回字節,然後使用np.frombuffer numpy數組(…)和重塑(28日28)然後可視化(如果需要)”“”defload_context(自我,上下文):進口tensorflow_similarity作為tfsimtensorflow_similarity.models進口SimilarityModeltensorflow.keras進口模型進口熊貓作為pd進口numpy作為np
              自我。tfsim_model = models.load_model(context.artifacts[“tfsim_model”])self.tfsim_model.load_index (context.artifacts [“tfsim_model”])def預測(自我,上下文,model_input):公益訴訟進口圖像進口base64進口io形象= np.array(形象。開放(io.BytesIO (base64.b64decode (model_input [“輸入”][0].encode ()))))# model_input必須的形式(28)1,28日image_reshaped = image.reshape (-1,28,28)/255.0= np.array (self.tfsim_model圖像。查找(image_reshaped k =5))image_dict = {}範圍(5):image_dict[我]=[圖像0][我].data.tostring ()。十六進製()返回pd.DataFrame.from_dict (image_dict東方=“指數”)
              ' ' '

模型工件可以登錄、注冊和部署REST端點都在同一個MLflow UI或利用MLflow API。除了這個功能,可以定義輸入和輸出模式作為一個模型簽名在測井過程中協助迅速傳球給隊友的部署。這是自動處理包括以下3行代碼

' '從mlflow.models。簽名進口infer_signature簽名= infer_signature (sample_image loaded_model.predict (sample_image))mlflow.pyfunc。log_model (artifact_path = mlflow_pyfunc_model_path python_model = TfsimWrapper() =工件,工件conda_env = conda_env簽名(簽名)' '

一旦簽名是推斷,數據輸入輸出模式預期將在UI中顯示如下。

模型推斷infer_signature函數簽名顯示在MLflow用戶界麵

一旦創建了REST端點,您可以方便地生成一個不記名的令牌通過將用戶設置在滑動麵板左邊的工作區。這種不記名的令牌,你可以插入Python包裝器代碼自動生成的REST端點的任何最終用戶麵對的應用程序或內部過程依賴於模型推理。

下麵的函數將幫助解碼JSON REST調用的響應。

' ' '進口numpy作為npdefprocess_response_image():”“反應”返回的JSON對象。我們可以通過這個循環對象返回重塑numpy數組每個推薦的映像,然後可以呈現”“”single_image_string =響應[我][“0”]image_array = np.frombuffer (字節.fromhex (single_image_string) dtype = np.float32)image_reshaped = np。重塑(image_array, (28,28))返回image_reshaped
              ' ' '

一個簡單的Streamlit應用程序構建的代碼來查詢此端點是可用的庫本博客文章。下麵的短記錄顯示了推薦。

構建自己的磚

一般來說,攝入的過程和格式化數據,模型優化,在規模、訓練和部署建議相似模型是許多小說和微妙的過程。與管理的高度優化的火花、三角洲湖和MLflow磚提供基礎,這個過程變得簡單明了Lakehouse平台。Beplay体育安卓版本鑒於您可以訪問計算集群管理,配置多個gpu的過程是無縫的,整個過程僅需幾分鍾。下麵的筆記本連接走你通過構建和部署的端到端過程詳細地相似模型。我們歡迎你來試一試,定製的方式適合您的需要,並建立自己的產品級ML-based形象與磚的推薦係統。

試著筆記本。

免費試著磚

相關的帖子

看到所有機器學習的帖子
Baidu
map