Following the descriptions of this paper, I try to carry out LightGCN directly based on NGCF model as follows:
def forward(self, users, pos_items, neg_items, drop_flag=True):
A_hat = self.sparse_mean_adj
ego_embeddings = torch.cat([self.embedding_dict['user_emb'], self.embedding_dict['item_emb']], 0)
all_embeddings = [ego_embeddings]
for k in range(len(self.layers)):
ego_embeddings = torch.sparse.mm(A_hat, ego_embeddings)
all_embeddings.append(ego_embeddings)
all_embeddings = torch.stack(all_embeddings, dim=1)
all_embeddings = torch.mean(all_embeddings, dim=1)
u_g_embeddings = all_embeddings[:self.n_user, :]
i_g_embeddings = all_embeddings[self.n_user:, :]
"""
look up
"""
u_g_embeddings = u_g_embeddings[users, :]
pos_i_g_embeddings = i_g_embeddings[pos_items, :]
neg_i_g_embeddings = i_g_embeddings[neg_items, :]
return u_g_embeddings, pos_i_g_embeddings, neg_i_g_embeddings
I have removed both the feature transformation matrices and non-linear activation function. Additionally, I replace norm_adj with mean_adj. Other hyper-parameter settings are as follows: lr = 0.001, lamda = 1e-4, K = 3, epoch = 1000. But the result seems not that ideal:
/home/lwy/anaconda3/envs/KGAT-Pytorch/bin/python /home/lwy/NGCF-LightGCN2/NGCF/main.py
n_users=29858, n_items=40981
n_interactions=1027370
n_train=810128, n_test=217242, sparsity=0.00084
already load adj matrix (70839, 70839) 0.12331271171569824
Epoch 0 [60.2s]: train==[266.12308=265.91809 + 0.20498]
Epoch 1 [60.2s]: train==[103.31055=102.82377 + 0.48685]
Epoch 2 [61.3s]: train==[76.84050=76.21890 + 0.62169]
Epoch 3 [61.8s]: train==[65.20748=64.50112 + 0.70636]
Epoch 4 [61.0s]: train==[57.59498=56.82709 + 0.76793]
Epoch 5 [60.6s]: train==[52.46275=51.64690 + 0.81580]
Epoch 6 [61.2s]: train==[48.68194=47.82713 + 0.85480]
Epoch 7 [60.6s]: train==[45.87556=44.98744 + 0.88810]
Epoch 8 [60.9s]: train==[43.57308=42.65576 + 0.91729]
Epoch 9 [60.6s + 86.3s]: train==[40.85046=39.90646 + 0.94400], recall=[0.12405, 0.26871], precision=[0.03890, 0.01713], hit=[0.47357, 0.70631], ndcg=[0.10771, 0.15002]
Epoch 10 [60.1s]: train==[39.45785=38.49084 + 0.96697]
Epoch 11 [60.5s]: train==[37.43333=36.44530 + 0.98802]
Epoch 12 [60.8s]: train==[36.24932=35.24067 + 1.00868]
Epoch 13 [60.2s]: train==[34.43538=33.40791 + 1.02747]
Epoch 14 [60.5s]: train==[33.88741=32.84295 + 1.04452]
Epoch 15 [60.8s]: train==[32.50555=31.44544 + 1.06010]
Epoch 16 [60.8s]: train==[31.84496=30.77052 + 1.07444]
Epoch 17 [60.4s]: train==[31.18940=30.10144 + 1.08792]
Epoch 18 [60.2s]: train==[30.06595=28.96548 + 1.10049]
Epoch 19 [61.0s + 86.2s]: train==[29.07747=27.96435 + 1.11312], recall=[0.13514, 0.29390], precision=[0.04178, 0.01860], hit=[0.49873, 0.73354], ndcg=[0.11629, 0.16292]
Epoch 20 [60.1s]: train==[28.85291=27.72777 + 1.12516]
Epoch 21 [60.6s]: train==[27.99307=26.85705 + 1.13602]
Epoch 22 [60.5s]: train==[27.20474=26.05751 + 1.14725]
Epoch 23 [60.2s]: train==[26.73112=25.57269 + 1.15840]
Epoch 24 [60.5s]: train==[26.02621=24.85734 + 1.16887]
Epoch 25 [60.9s]: train==[25.75082=24.57274 + 1.17807]
Epoch 26 [61.5s]: train==[25.21010=24.02402 + 1.18605]
Epoch 27 [60.2s]: train==[24.87771=23.68341 + 1.19428]
Epoch 28 [60.6s]: train==[24.10084=22.89890 + 1.20193]
Epoch 29 [60.8s + 86.1s]: train==[23.83304=22.62252 + 1.21055], recall=[0.13947, 0.30446], precision=[0.04313, 0.01924], hit=[0.50670, 0.74134], ndcg=[0.12042, 0.16890]
Epoch 30 [60.3s]: train==[23.28778=22.07078 + 1.21701]
Epoch 31 [60.9s]: train==[23.03534=21.81107 + 1.22426]
Epoch 32 [60.6s]: train==[22.75390=21.52212 + 1.23175]
Epoch 33 [60.1s]: train==[22.24394=21.00479 + 1.23913]
Epoch 34 [60.1s]: train==[21.83437=20.58843 + 1.24596]
Epoch 35 [60.1s]: train==[21.71244=20.45982 + 1.25263]
Epoch 36 [60.3s]: train==[21.40071=20.14179 + 1.25890]
Epoch 37 [60.7s]: train==[20.95679=19.69266 + 1.26413]
Epoch 38 [60.2s]: train==[20.55039=19.28064 + 1.26975]
Epoch 39 [60.7s + 85.8s]: train==[20.44785=19.17182 + 1.27603], recall=[0.14338, 0.31395], precision=[0.04432, 0.01979], hit=[0.51477, 0.74921], ndcg=[0.12412, 0.17426]
Epoch 40 [60.4s]: train==[20.17955=18.89828 + 1.28127]
Epoch 41 [60.6s]: train==[19.87287=18.58629 + 1.28659]
Epoch 42 [60.5s]: train==[19.71936=18.42737 + 1.29199]
Epoch 43 [60.4s]: train==[19.13259=17.83528 + 1.29731]
Epoch 44 [60.4s]: train==[18.95424=17.65184 + 1.30243]
Epoch 45 [60.6s]: train==[18.72514=17.41759 + 1.30756]
Epoch 46 [61.6s]: train==[18.39277=17.07915 + 1.31360]
Epoch 47 [62.3s]: train==[18.07647=16.75833 + 1.31813]
Epoch 48 [61.0s]: train==[18.08525=16.76234 + 1.32290]
Epoch 49 [60.8s + 86.7s]: train==[17.87114=16.54349 + 1.32764], recall=[0.14837, 0.32109], precision=[0.04568, 0.02022], hit=[0.52385, 0.75511], ndcg=[0.12718, 0.17785]
Epoch 50 [60.1s]: train==[17.42008=16.08800 + 1.33209]
Epoch 51 [60.9s]: train==[17.52630=16.18950 + 1.33681]
Epoch 52 [60.8s]: train==[17.27466=15.93404 + 1.34060]
Epoch 53 [60.5s]: train==[16.96308=15.61821 + 1.34486]
Epoch 54 [60.7s]: train==[17.04684=15.69842 + 1.34843]
Epoch 55 [60.8s]: train==[16.48394=15.13171 + 1.35224]
Epoch 56 [60.3s]: train==[16.37258=15.01538 + 1.35720]
Epoch 57 [60.6s]: train==[15.99654=14.63284 + 1.36370]
Epoch 58 [60.5s]: train==[15.85061=14.48335 + 1.36725]
Epoch 59 [60.4s + 85.9s]: train==[15.79825=14.42683 + 1.37142], recall=[0.15054, 0.32554], precision=[0.04628, 0.02053], hit=[0.52740, 0.76080], ndcg=[0.12876, 0.18028]
Epoch 60 [60.0s]: train==[15.53743=14.16208 + 1.37533]
Epoch 61 [60.2s]: train==[15.39389=14.01473 + 1.37916]
Epoch 62 [60.2s]: train==[15.08164=13.69826 + 1.38338]
Epoch 63 [60.2s]: train==[15.31049=13.92367 + 1.38683]
Epoch 64 [60.3s]: train==[14.80666=13.41616 + 1.39048]
Epoch 65 [60.4s]: train==[14.61778=13.22313 + 1.39465]
Epoch 66 [60.7s]: train==[14.59712=13.19897 + 1.39816]
Epoch 67 [60.7s]: train==[14.48054=13.07812 + 1.40242]
Epoch 68 [61.8s]: train==[14.11763=12.71134 + 1.40630]
Epoch 69 [60.7s + 85.6s]: train==[14.25008=12.84063 + 1.40946], recall=[0.15324, 0.33087], precision=[0.04716, 0.02085], hit=[0.53262, 0.76445], ndcg=[0.13133, 0.18351]
Epoch 70 [60.4s]: train==[13.70188=12.28905 + 1.41283]
Epoch 71 [60.7s]: train==[13.67261=12.25485 + 1.41777]
Epoch 72 [60.4s]: train==[13.45830=12.03676 + 1.42153]
Epoch 73 [60.5s]: train==[13.66729=12.24264 + 1.42466]
Epoch 74 [60.4s]: train==[13.48132=12.05340 + 1.42792]
Epoch 75 [60.4s]: train==[13.29481=11.86464 + 1.43017]
Epoch 76 [60.9s]: train==[13.20742=11.77449 + 1.43294]
Epoch 77 [60.9s]: train==[13.15398=11.71758 + 1.43639]
Epoch 78 [60.8s]: train==[12.93547=11.49618 + 1.43930]
Epoch 79 [60.9s + 85.7s]: train==[12.78802=11.34579 + 1.44223], recall=[0.15535, 0.33372], precision=[0.04765, 0.02104], hit=[0.53654, 0.76814], ndcg=[0.13218, 0.18466]
Epoch 80 [60.2s]: train==[12.58874=11.14276 + 1.44596]
Epoch 81 [60.4s]: train==[12.19576=10.74619 + 1.44958]
Epoch 82 [60.9s]: train==[12.24909=10.79602 + 1.45308]
Epoch 83 [60.6s]: train==[12.22942=10.77261 + 1.45682]
Epoch 84 [60.5s]: train==[12.16876=10.70818 + 1.46059]
Epoch 85 [61.1s]: train==[12.11418=10.65182 + 1.46235]
Epoch 86 [60.6s]: train==[11.83784=10.37170 + 1.46614]
Epoch 87 [61.2s]: train==[11.71266=10.24333 + 1.46933]
Epoch 88 [60.2s]: train==[11.87091=10.39799 + 1.47292]
Epoch 89 [60.2s + 86.7s]: train==[11.65144=10.17511 + 1.47632], recall=[0.15660, 0.33638], precision=[0.04813, 0.02123], hit=[0.53831, 0.76998], ndcg=[0.13369, 0.18662]
Epoch 90 [60.1s]: train==[11.23581=9.75627 + 1.47954]
Epoch 91 [60.7s]: train==[11.44357=9.96125 + 1.48233]
Epoch 92 [60.6s]: train==[11.35559=9.87024 + 1.48535]
Epoch 93 [60.4s]: train==[11.14640=9.65725 + 1.48915]
Epoch 94 [60.4s]: train==[11.21134=9.71909 + 1.49225]
Epoch 95 [60.5s]: train==[11.02477=9.52928 + 1.49550]
Epoch 96 [60.6s]: train==[10.91048=9.41239 + 1.49809]
Epoch 97 [60.6s]: train==[10.83567=9.33497 + 1.50071]
Epoch 98 [61.2s]: train==[10.92937=9.42558 + 1.50379]
Epoch 99 [61.7s + 86.4s]: train==[10.41902=8.91162 + 1.50739], recall=[0.15799, 0.33832], precision=[0.04857, 0.02137], hit=[0.53962, 0.77108], ndcg=[0.13481, 0.18793]
Epoch 100 [60.7s]: train==[10.42737=8.91670 + 1.51068]
Epoch 101 [60.4s]: train==[10.44687=8.93280 + 1.51407]
Epoch 102 [60.5s]: train==[10.41840=8.90180 + 1.51661]
Epoch 103 [60.9s]: train==[10.34340=8.82457 + 1.51884]
Epoch 104 [60.5s]: train==[10.08196=8.55952 + 1.52245]
Epoch 105 [60.9s]: train==[9.96486=8.43928 + 1.52557]
Epoch 106 [60.3s]: train==[10.10532=8.57640 + 1.52892]
Epoch 107 [60.5s]: train==[9.91326=8.38158 + 1.53169]
Epoch 108 [61.8s]: train==[9.93930=8.40537 + 1.53394]
Epoch 109 [60.2s + 85.8s]: train==[9.82825=8.29161 + 1.53665], recall=[0.15889, 0.33996], precision=[0.04881, 0.02149], hit=[0.54093, 0.77296], ndcg=[0.13505, 0.18846]
Epoch 110 [60.1s]: train==[9.89731=8.35803 + 1.53927]
Epoch 111 [60.2s]: train==[9.68567=8.14511 + 1.54055]
Epoch 112 [60.7s]: train==[9.62892=8.08452 + 1.54440]
Epoch 113 [60.3s]: train==[9.61257=8.06528 + 1.54729]
Epoch 114 [60.3s]: train==[9.61021=8.06060 + 1.54960]
Epoch 115 [60.3s]: train==[9.36545=7.81435 + 1.55110]
Epoch 116 [60.3s]: train==[9.41847=7.86497 + 1.55349]
Epoch 117 [60.5s]: train==[9.20634=7.64965 + 1.55669]
Epoch 118 [61.0s]: train==[9.24341=7.68390 + 1.55952]
Epoch 119 [60.4s + 86.0s]: train==[8.96627=7.40440 + 1.56186], recall=[0.16035, 0.34069], precision=[0.04906, 0.02153], hit=[0.54334, 0.77490], ndcg=[0.13590, 0.18912]
Epoch 120 [60.3s]: train==[9.02170=7.45705 + 1.56466]
Epoch 121 [60.7s]: train==[8.90828=7.34105 + 1.56723]
Epoch 122 [60.1s]: train==[8.87648=7.30680 + 1.56967]
Epoch 123 [60.7s]: train==[8.80425=7.23266 + 1.57158]
Epoch 124 [60.8s]: train==[8.85096=7.27670 + 1.57424]
Epoch 125 [60.3s]: train==[8.72812=7.15078 + 1.57735]
Epoch 126 [60.9s]: train==[8.77514=7.19571 + 1.57942]
Epoch 127 [60.5s]: train==[8.60509=7.02251 + 1.58259]
Epoch 128 [60.8s]: train==[8.67968=7.09404 + 1.58564]
Epoch 129 [60.3s + 86.6s]: train==[8.42672=6.83914 + 1.58760], recall=[0.15989, 0.34315], precision=[0.04903, 0.02163], hit=[0.54153, 0.77624], ndcg=[0.13554, 0.18959]
Epoch 130 [60.1s]: train==[8.59887=7.00849 + 1.59037]
Epoch 131 [60.2s]: train==[8.47767=6.88626 + 1.59140]
Epoch 132 [59.9s]: train==[8.39836=6.80522 + 1.59314]
Epoch 133 [59.5s]: train==[8.37008=6.77470 + 1.59538]
Epoch 134 [60.0s]: train==[8.28425=6.68692 + 1.59732]
Epoch 135 [59.7s]: train==[8.49748=6.89880 + 1.59868]
Epoch 136 [59.7s]: train==[8.17713=6.57651 + 1.60061]
Epoch 137 [59.6s]: train==[8.08149=6.47830 + 1.60320]
Epoch 138 [59.7s]: train==[8.13093=6.52483 + 1.60609]
Epoch 139 [59.7s + 74.5s]: train==[8.00626=6.39854 + 1.60772], recall=[0.16084, 0.34412], precision=[0.04935, 0.02170], hit=[0.54260, 0.77755], ndcg=[0.13590, 0.18991]
Epoch 140 [59.1s]: train==[8.02596=6.41510 + 1.61087]
Epoch 141 [59.2s]: train==[8.03624=6.42338 + 1.61286]
Epoch 142 [59.3s]: train==[7.76434=6.14867 + 1.61567]
Epoch 143 [59.3s]: train==[7.74384=6.12575 + 1.61810]
Epoch 144 [59.2s]: train==[7.86404=6.24304 + 1.62100]
Epoch 145 [59.3s]: train==[7.65367=6.03018 + 1.62350]
Epoch 146 [59.3s]: train==[7.79558=6.17091 + 1.62467]
Epoch 147 [59.4s]: train==[7.64348=6.01648 + 1.62700]
Epoch 148 [59.4s]: train==[7.60244=5.97293 + 1.62950]
Epoch 149 [59.4s + 74.4s]: train==[7.64775=6.01733 + 1.63042], recall=[0.16036, 0.34484], precision=[0.04915, 0.02173], hit=[0.54119, 0.77818], ndcg=[0.13561, 0.19003]
Epoch 150 [59.5s]: train==[7.54225=5.90988 + 1.63237]
Epoch 151 [59.6s]: train==[7.40085=5.76583 + 1.63502]
Epoch 152 [59.7s]: train==[7.42210=5.78523 + 1.63688]
Epoch 153 [59.5s]: train==[7.48156=5.84386 + 1.63770]
Epoch 154 [59.7s]: train==[7.39741=5.75809 + 1.63932]
Epoch 155 [59.7s]: train==[7.22317=5.58149 + 1.64167]
Epoch 156 [59.7s]: train==[7.23868=5.59447 + 1.64421]
Epoch 157 [59.7s]: train==[7.12774=5.48157 + 1.64617]
Epoch 158 [59.7s]: train==[7.17159=5.52278 + 1.64881]
Epoch 159 [59.7s + 74.6s]: train==[7.27608=5.62471 + 1.65135], recall=[0.16046, 0.34535], precision=[0.04927, 0.02178], hit=[0.53868, 0.77725], ndcg=[0.13563, 0.19018]
Epoch 160 [59.4s]: train==[7.00549=5.35218 + 1.65331]
Epoch 161 [59.2s]: train==[6.99893=5.34303 + 1.65590]
Epoch 162 [59.3s]: train==[7.12252=5.46511 + 1.65740]
Epoch 163 [59.3s]: train==[7.23824=5.57958 + 1.65866]
Epoch 164 [59.4s]: train==[6.91963=5.25922 + 1.66041]
Epoch 165 [59.4s]: train==[6.99961=5.33781 + 1.66181]
Epoch 166 [59.3s]: train==[6.99266=5.32886 + 1.66381]
Epoch 167 [59.3s]: train==[6.99133=5.32623 + 1.66510]
Epoch 168 [59.4s]: train==[6.81604=5.14932 + 1.66672]
Epoch 169 [59.4s + 74.4s]: train==[6.89832=5.22984 + 1.66848], recall=[0.15889, 0.34526], precision=[0.04879, 0.02180], hit=[0.53584, 0.77758], ndcg=[0.13417, 0.18929]
Epoch 170 [59.1s]: train==[6.86331=5.19311 + 1.67020]
Epoch 171 [59.5s]: train==[6.74868=5.07659 + 1.67209]
Epoch 172 [59.5s]: train==[6.77525=5.10093 + 1.67432]
Epoch 173 [59.5s]: train==[6.68779=5.01278 + 1.67501]
Epoch 174 [59.5s]: train==[6.59584=4.91946 + 1.67637]
Epoch 175 [59.5s]: train==[6.66248=4.98471 + 1.67777]
Epoch 176 [59.5s]: train==[6.57267=4.89164 + 1.68103]
Epoch 177 [59.5s]: train==[6.44634=4.76320 + 1.68314]
Epoch 178 [59.5s]: train==[6.47096=4.78654 + 1.68442]
Epoch 179 [59.6s + 74.9s]: train==[6.61471=4.92859 + 1.68611], recall=[0.15950, 0.34521], precision=[0.04889, 0.02179], hit=[0.53637, 0.77865], ndcg=[0.13456, 0.18948]
Epoch 180 [59.5s]: train==[6.42855=4.74134 + 1.68721]
Epoch 181 [59.6s]: train==[6.56521=4.87680 + 1.68842]
Epoch 182 [59.7s]: train==[6.58104=4.89148 + 1.68957]
Epoch 183 [59.7s]: train==[6.27660=4.58523 + 1.69138]
Epoch 184 [59.3s]: train==[6.28665=4.59311 + 1.69353]
Epoch 185 [59.5s]: train==[6.29950=4.60468 + 1.69482]
Epoch 186 [59.4s]: train==[6.34056=4.64325 + 1.69731]
Epoch 187 [59.6s]: train==[6.29903=4.60059 + 1.69844]
Epoch 188 [59.6s]: train==[6.39128=4.69142 + 1.69986]
Epoch 189 [59.6s + 74.3s]: train==[6.14241=4.44064 + 1.70176], recall=[0.15999, 0.34552], precision=[0.04917, 0.02180], hit=[0.53704, 0.77818], ndcg=[0.13511, 0.18988]
Early stopping is trigger at step: 5 log:0.15999063147947018
Best Iter=[13]@[13017.9] recall=[0.16084 0.22535 0.27380 0.31192 0.34412], precision=[0.04935 0.03497 0.02847 0.02448 0.02170], hit=[0.54260 0.64884 0.70755 0.74684 0.77755], ndcg=[0.13590 0.15620 0.17059 0.18131 0.18991]
Process finished with exit code 0
So I sincerely ask you that why you didn't directly modify the code on NGCF, and why my result is not ideal? Thank you very much!