1. 報(bào)告要求
- 并行化
- 提高運(yùn)行速度
- 突顯cache友好
- 對比實(shí)驗(yàn)
- 對關(guān)鍵步驟描述算法
2. 初步草案
- 選擇實(shí)現(xiàn)語言。我選擇了較為熟悉的python作為編程語言。因?yàn)閜ython的庫numpy在底層調(diào)用c與fortran,并且采用優(yōu)化過的算法,因此在矩陣運(yùn)算方面速度極高。
- 選擇預(yù)測方法。由于要突顯cache友好,且實(shí)現(xiàn)并行化,我認(rèn)為logistic regression能符合要求。
- 選擇訓(xùn)練方式。訓(xùn)練方式不外乎三種:BGD, mini BGD, SGD。其中SGD在運(yùn)行中占用的內(nèi)存最小(每次處理一組數(shù)據(jù)即可)。因此,我將會(huì)對三種訓(xùn)練方式進(jìn)行考察,并著重觀察SGD。
- 選擇并行化的解決方案。使用python內(nèi)置的multiprocessing庫即可。并驗(yàn)證按參數(shù)并行運(yùn)算和分批并行運(yùn)算的速度比較。
3. 并行化解決方案
3.1 按參數(shù)并行運(yùn)算
梯度計(jì)算函數(shù)
def compute_sum(parameters, result, data_array, theta, number_of_examples):
for parameter in parameters: # [n, n+1, n+2, ..., m]
summition = 0
for sample in data_array:
# (hypothesis - real_value) * feature_i
summition += (hypothesis(sample[:-1], theta) - sample[-1]) * sample[parameter]
result[parameter] = summition / number_of_examples # gradient for feature_i
運(yùn)行結(jié)果: