優化ML模型特徵的一種線性規劃方法

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"從迭代Facebook的News Feed排名"},{"type":"link","attrs":{"href":"https:\/\/engineering.fb.com\/2021\/01\/26\/ml-applications\/news-feed-ranking\/","title":null,"type":null},"content":[{"type":"text","text":"算法"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"到向用戶提供與他們最相關的廣告,Facebook一直在探索新的特徵來幫助改進我們的機器學習(ML)模型。每次我們添加新特徵時都會引入一個具有挑戰性的數據工程問題,從而需要我們從戰略層面思考我們所做出的選擇。更復雜的特徵和更精巧的技術都需要額外的存儲空間。即使在Facebook這麼大體量的公司中,容量也不是無限的。如果任其發展,不加選擇地接受所有特徵,我們很快就會不堪重負,模型迭代速度和運行效率都會被拖累。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"爲了更好地理解這些特徵與支持它們所需的基礎設施容量之間的關係,我們可以將系統抽象成一個線性規劃問題。這種方法可以讓我們儘可能提升模型的性能、探索其性能表現對各種基礎設施約束條件的敏感性,並研究不同服務之間的關係。這項工作是由我們工程團隊的數據科學家們完成的,它展示了分析和數據科學在ML中的價值所在。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"支持特徵開發"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"不斷引入能充分利用新數據來維護高性能模型的特徵是非常重要的。新特徵負責提供大部分的模型增量改進。這些ML模型對我們的廣告投放系統是很有用的。它們共同運作,用於預測用戶對廣告採取特定行動的可能性。我們在努力不斷改進這些模型,目標是讓系統只投放與用戶相關的廣告。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"隨着我們的技術變得越來越複雜,我們開發了許多更復雜的特徵,這些特徵又需要更多的基礎設施能力。根據其目的,一個特徵利用多種不同的服務。某些特徵具有更高的內存成本,而另一些特徵則需要額外的CPU算力或佔用更多存儲空間。合理利用我們的基礎設施來儘可能提升模型性能是非常重要的。我們必須巧妙地分配資源,並量化不同場景的權衡條件。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"爲了解決這些問題,我們將系統抽象成了一個線性規劃問題,其目標是最大化我們模型的種種指標。我們使用這個框架來更好地理解各種特徵和服務之間的交互。有了這些知識,我們就可以自動選擇最佳特徵,確定要投資的基礎設施服務,並維護模型和服務的健康水平。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"爲我們的問題建立框架"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"在探討我們的框架之前,我們首先引入一個模型問題。假設我們有多個特徵,它們都佔用了一定的空間(矩形的高度)併爲我們的模型(青色方塊)貢獻了一定的增益,但我們無法在有限的容量中容納所有這些特徵。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/bf\/c3\/bff54a947a6ccd91c2edfcb11d8af9c3.jpg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"一個解決方案是簡單地選擇增益最大的特徵(青色方塊),直到容量不足爲止。但如果你只是優先考慮增益,就可能無法充分利用你的資源。例如,選擇了一個增益較大的大特徵時,你可能會佔用兩個增益較小的小特徵的空間。而這兩個小特徵加起來會比一個大特徵更物有所值。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/2d\/5e\/2db53f5409a864a1c30b634ce12c7c5e.jpg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"如果我們稍微多想一下,可以轉而尋找能夠爲我們帶來最大增益的特徵——也就是每單位存儲獲得增益最大的特徵。然而,如果我們只從這個角度來做出選擇,我們最後可能會遺漏一些收益較低,但我們仍有空間容納的特徵。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/29\/3e\/299f108cbced2f3765801de8f016203e.jpg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"上面這些都是我們基礎設施的非常簡化的視圖,但實際情況要複雜一些。例如,特徵通常不會只佔用一種資源,而是會需要很多資源——例如內存、CPU或其他服務中的存儲。我們可以添加一個服務B,這樣示例就變得稍複雜一些,其中橙色特徵同時會佔用服務A和服務B中的空間。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/41\/63\/417a1f10019cf374a8d3e1dca6519463.jpg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"精挑細選要使用的特徵並不是控制我們基礎設施用量的唯一方法。我們還可以採用各種技術來提高特徵存儲的效率。這有時會帶來成本,代價可能是特徵自身或者是一個服務的容量。在這個示例中,假設我們可以將某些特徵的存儲成本(粉紅色邊框)減半,但代價是降低特徵的增益,並使用服務B中的一些有限容量。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/a1\/1f\/a1a3fd8382d3fbf6a21yy828352b5d1f.jpg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我們的示例就介紹到這裏,但這足夠講清楚一般情況了——基礎設施可以是一個複雜的、具有不同約束的互連繫統。實際上,我們的能力並不是一成不變的。如果有必要,我們可以來回移動資源。特徵也不是我們唯一在處理的事情。還有許多項目和工作流程也在爭奪同樣的資源。我們不僅需要選擇讓我們的收益最大化的特徵,而且還要回答關於我們的系統如何響應變化的一些問題:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我們選擇哪些特徵來優化增益?"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"特徵壓縮是值得的嗎?更重要的是,工程師花時間來實施它是否是值得的?"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"如果我們向服務A添加更多容量,增益會如何變化?"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"服務依賴項之間是如何交互的?如果我們增加服務B的容量,我們可以減少服務A的用量嗎?"}]}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"擴展問題"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我們先退後一步,回顧一下模型問題的條件:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"numberedlist","attrs":{"start":null,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我們想要最大化我們的增益。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我們受限於服務A的容量。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":3,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我們還受限於服務B的容量,只有某些特徵需要用到它。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":4,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"某些特徵可能會被壓縮,但是:"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":5,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"它們會面臨增益損失。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":6,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"必須使用服務B的部分容量。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我們可以將所有這些約束表示爲一個線性方程組。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"令𝑥是一個0或1的向量,表示我們是否選擇了特徵;令𝑔是一個存儲特徵增益的向量。下標𝑓和𝑐表示我們是指定完整成本還是壓縮特徵。例如,𝑥𝑓表示我們選擇包含完整的、未壓縮的特徵,而𝑔𝑐表示壓縮特徵的成本。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"根據這些定義,我們的目標是最大化:"}]},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/a4\/81\/a4cdbc06a7891yy8d8f7e1a9dffcfc81.jpg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我們現在可以向方程添加約束來模擬我們的基礎設施約束:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"numberedlist","attrs":{"start":null,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"特徵只能被選擇並壓縮、選擇但不壓縮或不被選擇。我們不能選擇相同特徵的壓縮版本和未壓縮版本。"}]}]}]},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/e6\/55\/e6a745c9532yy9d8fa863e31fe3cdb55.jpg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":2,"normalizeStart":2},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"令𝑠是特徵的存儲成本,下標𝐴和𝐵分別代表服務A和B。例如,𝑠𝐴𝑐表示服務A中壓縮特徵的存儲成本。我們受到兩個服務的容量約束。"}]}]}]},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/47\/06\/4783b74f3c940bb3081e94c62f91fa06.jpg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":3,"normalizeStart":3},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":3,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"必須使用服務B的一些容量才能啓用壓縮。我們將其表示爲必須選擇的一些特徵。"}]}]}]},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/1c\/cc\/1c697f07780e8a4589594c41ab7837cc.jpg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"這樣,我們現在已經在幾個方程中完全定義了我們的問題,並且可以使用線性規劃技術對它們求解。當然,由於我們希望可以自動化和提高生產力,因此方程組很容易轉化爲代碼。對於本示例,我們使用優秀的NumPy和CVXPY包在Python中完成操作。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"import cvxpy as cp\nimport numpy as np\nimport pandas as pd\n \n# Assuming data is a Pandas DataFrame that contains relevant feature data\ndata = pd.DataFrame(...)\n# These variables contain the maximum capacity of various services\nservice_a = ...\nservice_b = ...\n \nselected_full_features = cp.Variable(data.shape[0], boolean=True)\nselected_compressed_features = cp.Variable(data.shape[0], boolean=True)\n \n# Maximize the feature gain\nfeature_gain = (\n data.uncompressed_feature_gain.to_numpy() @ selected_full_features\n + data.compressed_feature_gain.to_numpy() @ selected_compressed_features\n)\n \nconstraints = [\n # 1. We should not select the compressed and uncompressed version\n # of the same feature\n selected_full_features + selected_compressed_features <= np.ones(data.shape[0]),\n # 2. Features are restricted by the maximum capacity of the services\n data.full_storage_cost.to_numpy() @ selected_full_features\n + data.compressed_storage_cost.to_numpy() @ selected_full_features\n <= service_a,\n data.full_memory_cost.to_numpy() @ selected_full_features\n + data.compressed_memory_cost.to_numpy() @ selected_compressed_features\n <= service_b,\n # 3. Some features must be selected to enable compression\n selected_full_features >= data.special_features.to_numpy(),\n]"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"利用這個框架"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"現在我們有了一個可以用來表達我們的問題和假設的框架。如果我們想了解服務A的容量增加如何轉化爲特徵增益,我們可以在不同的服務A容量值下運行上面的優化問題並繪製增益圖。這樣我們就可以直接量化每次容量增加所能帶來的回報。我們可以將其當作一種強信號,來指導我們未來應該投資哪些服務,並直接對比更多特徵內存、計算或存儲的投資回報。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/38\/42\/38836cbba98b81916bee0d00e745e342.jpg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"類似地,我們可以查看各個服務之間的關係。我們只需在保持增益不變的情況下改變服務A和B的容量。可以看到,隨着服務B的容量增加,實現相同增益所需的服務A容量更少了。如果一項服務的壓力比另一項服務大很多,則我們可以利用這一點見解。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/e9\/e4\/e9b3891c0e0ee663c2797c599b2fa0e4.jpg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"使用線性規劃作爲自動化決策的框架"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"以前,特徵批准是一個手動過程,團隊需要花費寶貴的時間來計算我們可以支持多少特徵,並分析增加服務容量能帶來的投資回報。在像Facebook這樣的公司中——我們有很多不斷迭代的模型——這種方法是無法擴展的。將我們的服務構建爲一個線性方程系統後,我們得以將一個複雜的互連繫統簡化爲一種易於溝通的基本關係組合。由此以來,我們可以在部署特徵和投資基礎設施時做出更明智的決策。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"原文鏈接:"},{"type":"link","attrs":{"href":"https:\/\/engineering.fb.com\/2021\/07\/29\/data-infrastructure\/linear-programming\/","title":null,"type":null},"content":[{"type":"text","text":"https:\/\/engineering.fb.com\/2021\/07\/29\/data-infrastructure\/linear-programming\/"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章