1.取樣是根據邊的id來採的,而且使用了整個graph的所有邊。
n_edges = g.number_of_edges(
)train_seeds = np.arange(n_edges)
具體的dataloader(即得到每個batch真正訓練的資料)**如下:
dataloader = dgl.dataloading.edgedataloader(
g, train_seeds, sampler, exclude=
'reverse_id'
,# for each edge with id e in reddit dataset, the reverse edge is e ± |e|/2.
reverse_eids=th.cat(
[ th.arange(n_edges //
2, n_edges)
, th.arange(
0, n_edges //2)
]), negative_sampler=negativesampler(g, args.num_negs)
, batch_size=args.batch_size,
shuffle=
true
, drop_last=
false
, pin_memory=
true
, num_workers=args.num_workers)
訓練時得到的乙個batch訓練資料**如下:
for step,
(input_nodes, pos_graph, neg_graph, blocks)
inenumerate
(dataloader)
:
這裡整體的流程應該如下:
2.loss計算
**如下:
class
crossentropyloss
(nn.module)
:def
forward
(self, block_outputs, pos_graph, neg_graph)
:with pos_graph.local_scope():
pos_graph.ndata[
'h']
= block_outputs
'h',
'h',
'score'))
pos_score = pos_graph.edata[
'score'
]with neg_graph.local_scope():
neg_graph.ndata[
'h']
= block_outputs
'h',
'h',
'score'))
neg_score = neg_graph.edata[
'score'
] score = th.cat(
[pos_score, neg_score]
) label = th.cat(
[th.ones_like(pos_score)
, th.zeros_like(neg_score)])
.long()
loss = f.binary_cross_entropy_with_logits(score, label.
float()
)return loss
可以看到,最終sage得到的每乙個batch的輸出block_outpus
直接賦值給了pos_graph
和neg_graph
的ndata['h']
,這裡可以直接賦值的原因就是因為pos_graph
和neg_graph
中的結點個數和block_outputs
的維度相同,因為是以這兩個圖中的結點作為seeds進行的鄰居取樣。
具體loss的計算,這裡使用的是f.binary_cross_entropy_with_logits
,和**中的好像有一點不一樣,但是效果應該是相同的。
**中的公式為:
jg(**中的zu)=
−log
(σ(z
utzv
))−q
⋅evn
∼pn(
v)lo
g(σ(
−zut
zvn)
)j_g(z_u)=-log(\sigma(z^t_uz_v))-q·\mathbb_log(\sigma(-z^t_uz_))
jg(zu
)=−
log(
σ(zu
tzv
))−
q⋅ev
n∼p
n(v
)lo
g(σ(
−zut
zvn
))
f.binary_cross_entropy_with_logits
公式為:
ln=因為正樣本的類別為1,負樣本的類別為0,因此分別代入樣本類別y−wn[
yn⋅l
ogσ(
xn)+
(1−y
n)⋅l
og(1
−σ(x
n))]
l_n=-w_n[y_n·log\sigma(x_n)+(1-y_n)·log(1-\sigma(x_n))]
ln=−w
n[y
n⋅l
ogσ(
xn)
+(1−
yn)
⋅log
(1−σ
(xn
))]
ny_n
yn中,這兩個公式主要區別就在於後半部分是log
(σ(−
zutz
vn
)log(\sigma(-z^t_uz_)
log(σ(
−zut
zvn
)還是log
(1−σ
(−zu
tzvn
))
log(1-\sigma(-z^t_uz_))
log(1−
σ(−z
utz
vn
))了,整體應該影響不大。
3.後續測試的時候,是通過乙個邏輯回歸,迭代1w次進行的,這裡才區分了訓練集和測試集。
todo:弄明白edgedataloader中的exlude
引數的作用,為什麼要提供reverse_eids
exclude引數主要是為了防止information leakage. reverse_eids就是要剔除的eid.
有監督學習和無監督學習 無監督學習
一.無監督學習包含的演算法 聚類 kmeans聚類演算法 降維 pca 之所以叫無監督學習 是因為模型是從無標籤的資料開始學習,沒有目標值。二.kmeans聚類 1.聚類演算法步驟 定義 將高維資料轉化為低維資料的過程,在此過程中可能會捨棄原有資料,創造新的變數 作用 降低原始資料的維數 複雜度 損...
無監督學習與監督學習
1.無監督和有監督的理解方法有很多,主要可以從以下幾方面來理解 1 無監督與監督學習的區別在於乙個無教學值,乙個有教學值。但是,個人認為他們的區別在於無監督學習一般是採用聚簇等演算法來分類不同樣本。而監督學習一般是利用教學值與實際輸出值產生的誤差,進行誤差反向傳播修改權值來完成網路修正的。但是無監督...
監督學習和無監督學習
機器學習要解決的第一類問題是分類問題。機器學習的另一項任務是回歸,它主要用於 數值型資料。大多數人可能都見過回歸的例子 資料擬合曲線 通過給定資料點的最優擬合曲線。分類和回歸都屬於監督學習,之所以稱之為監督學習,是因為這類演算法必須知道 什麼,即目標變數的分類資訊。與監督學習對應的是無監督學習,此時...