DGCFコード解釈の再開

こんにちは、私はシャオミンです。若い頃はシャオミンシュアイを知りません家の近くで、新しいモデルが発表されてから2か月以内、さらには1か月以内に、誰かがあなたの記事を引用し(他の人は喜んで引用していると思いますが、実際にはあなたを踏んでいます)、すぐに結果と比較します。あなたよりも優れています。この種の通常の競争/競争は非常に良いと思います。公正でオープンです。オープンソースでなくてもかまいません。論文で宣言された結果が達成されたかどうかは誰にもわかりませんが、これでは信じられません。

一般的に、DGCFはCFコラボレーティブフィルタリングの範囲内です。もちろん、最良のモデルと比較する必要があります。現在、最良のモデルはGCN(LightGCN)です。この方法は、寸法が小さい場合に非常に良い結果を得ることができます。効果は良好です。数百万のユーザーや数千万のクリックなど、データ量が多い場合は、モデルパラメータを減らす必要があります(埋め込みサイズとn_layers)。そうしないと、GPU /メモリが十分でなく、モデルが良好で、カバレッジが包括的です。あなたは考えすぎますか、この種の良いことは出くわすのが難しいかもしれませんか?さらに、このDGCFは、GCNメソッドと同様のGNNメソッドのアプリケーションでもあり(違いについては次回説明します)、GNNを使用する最適なシーケンスモデルはGCE-GNNです。現在、このメソッドの公式のオープンソースはありません。コードの愚かな新人(それは私です)はまだ実装されていません(非常に難しい)。多くのオープンソースの新しい方法は、実際に適用するのが実際には困難です。1はデータ量の問題(スペースとメモリはすべて問題です)、2は速度/時間の問題であり、まったく実行できず、この領域の問題はすべて顕著です。埋め込みサイズなどのパラメータをやみくもに大きくして効果を上げると、最初の2つの問題が非常に深刻になり、結果は次のレベルにしか置けません。縮小後も、効果は従来の方法と変わりません。これは大変な心配です。

大物は今年このモデルを完成させ、チューニングに集中する予定です。たとえば、youtubeどうやってあきらめることができますか?たとえば、すべてのユーザーをカバーできますか?ディメンションが縮小され、1人のユーザーのCTRが低下した場合でも、全体的な状況は大きくなりますか?(こんなにいい蛾はいるの?ハハ)、トレーニングの埋め込みを続けて、アップデートがあるまで次回それを使うことは可能ですか?もちろん、私はここであなたたちと私の人生を共有することを選択します(はい、あなたは仕事と人生を通してのみ人を知ることができます)、そして私はすでにあなたのニュースを待っています、もちろんあなたはグループで人生について話すこともできます理想的には、人生の些細な事柄や問題について話します。シャオミンは常にあなたに同行し、決して離れることはありません。

ディープラーニングQQグループ277356808のビデオ推奨について

ディープラーニングのビジュアル向けQQグループ629530787

ここであなたのことを待ってる

あまり追加しないでください。必要ありません。さらに、このWebページでプライベートチャット/プライベートメッセージを受け入れないでください。

 1-データ構築

一般的に、CFはクリックタイムシーケンスに注意を払わないため、リコール評価でリーブワン方式を使用するのは誤りです。効果はシーケンスモデルほど良くありません。まず、トレーニングセットとテストセットを見てください。

0 10 5 16 17 9 0 15 14 3 6 11 13 12
1 22 27 19 39 20 48 36 29 44 23 46 26 47 33 40 25 34 38 31 24 30 41 49 37
2 51 53 1 63 62 58 61 56 57 55
3 1 80 83 77 68 67 64 72 69 66 73 76 70 82 74
4 87 94 86 96 90 92 85 5 88 91 9 95
5 106 105 100 22 17 104 56 99 101 41
6 25 138 117 75 133 118 110 112 121 136 113 108 124 115 122 72 99 130 127 100 111 137 135 116 73 139 125 120 27 119 107
7 103 140 145 141 146 8 37 125 14 144 142 73
8 235 11 127 158 42 167 234 248 190 54 195 212 92 77 147 178 200 216 257 255 218 232 162 166 12 201 256 211 36 142 123 204 196 174 189 183 247 14 242 159 3 168 46 58 170 206 228 176 160 197 243 233 154 231 171 237 215 225 43 156 210 161 236 182 227 149 209 251 245 180 157 191 163 186 229 73 13 177 4 254 238 193 258 57 188 5 39 98 94 198 148 222 169 199 249 35 214 223 246 219 244 18 259 252
9 47 262 267 265 264 3 78 261 220 212 202 266 57 46 110 37 263 82 69

テストセットも同様で、user_idの前にitem_idがあります

0 1 8 2 4
1 28 50 21 35 32 0 45
2 60 59 24
3 65 81 75 79
4 98 97 93
5 36 102 73
6 105 129 114 131 132 123 128 109 126
7 13 47 143
8 165 132 253 208 221 203 240 51 187 119 230 175 155 172 220 151 28 152 226 184 143 192 164 96 179 224 48 217 202 153
9 135 48 6 142 121

ユーザーとアイテムにも対応するコードがありますが、実際には検証セットは必要ないので、トレーニングにもっとデータを使うのは良くありませんか?リコールのために時間を節約するのは良いことではありませんか?どの検証セット

org_id remap_id
1 0
2 1
3 2
5 3
6 4
7 5
8 6
9 7
10 8

org_id remap_id
1193 0
2355 1
1287 2
2804 3
595 4
1035 5
3105 6
1270 7
527 8

以上が基本データです。自分で作成できれば作業を開始できます。他人のコードを変更せずに作者のコードをコピーする必要はありません。コードフローを理解することによってのみ、他人のコードを変更できます。

2-データ入力コードに関して、この部分LightGCNコードと同じです

[赤ちゃんを連れて会社に来る人たちを見ると、まだ複雑な気持ち(顔を覆っている)があります。人生の意味をいつ理解できますか?神の取り決めは正確には何ですか?

[昨日は眠すぎたので、戻って服を洗って、お母さんに電話しました。どんな話題でも、最後は「早く誰かを見つける」に違いありません。私もとても心配でしたが、必要ないようでした。 、心配しないでください、時間をかけてください、あなたはまだ若いです、あなたは中国の新年の間に1歳年上になります、30歳未満です、それはまだ早いです、最初に良い仕事をし、良い仕事をし、仕事は私を成し遂げます、継続的な注意を歓迎し、メロンを食べることを歓迎します]

違いは次のとおりです:(スパースマトリックスが適切に処理されていない場合、メモリが爆発的に増加し、実際のアプリケーションが直接制限されます)

    def get_adj_mat(self, low=0.00006, high=1.0):
##        try:
        t1 = time.time()
        adj_mat, norm_adj_mat, norm_adj_mat_noeye, band_cross_adj_mat = self.create_adj_mat(low=low, high=high)
            
        print('already load adj matrix', adj_mat.shape, time.time() - t1)
##        except Exception as error:
##            print(error)
##            return
        return adj_mat, norm_adj_mat, norm_adj_mat_noeye, band_cross_adj_mat

    def create_adj_mat(self, low=0.0075, high=0.02):
        t1 = time.time()
        adj_mat = sp.dok_matrix((self.n_users + self.n_items, self.n_users + self.n_items), dtype=np.float32)
        adj_mat = adj_mat.tolil()
        R = self.R.tolil()
        # prevent memory from overflowing
        '''
        for i in range(5):
            adj_mat[int(self.n_users*i/5.0):int(self.n_users*(i+1.0)/5), self.n_users:] =\
            R[int(self.n_users*i/5.0):int(self.n_users*(i+1.0)/5)]
            adj_mat[self.n_users:,int(self.n_users*i/5.0):int(self.n_users*(i+1.0)/5)] =\
            R[int(self.n_users*i/5.0):int(self.n_users*(i+1.0)/5)].T
        '''

        adj_mat[:self.n_users, self.n_users:] = R
        adj_mat[self.n_users:, :self.n_users] = R.T        
        adj_mat = adj_mat.todok()
        print('already create adjacency matrix', adj_mat.shape, time.time() - t1)
        
        t2 = time.time()
        def normalized_adj_single(adj):
            rowsum = np.array(adj.sum(1))
            d_inv = np.power(rowsum, -1).flatten()
            d_inv[np.isinf(d_inv)] = 0.
            d_mat_inv = sp.diags(d_inv)

            norm_adj = d_mat_inv.dot(adj)
            print('generate single-normalized adjacency matrix.')
            return norm_adj.tocoo()
        
        def normalized_adj_laplacian(adj):
            rowsum = np.array(adj.sum(1))
            d_inv = np.power(rowsum, -0.5).flatten()
            d_inv[np.isinf(d_inv)] = 0.
            d_mat_inv = sp.diags(d_inv)
            row_norm_adj = d_mat_inv.dot(adj)
            norm_adj = row_norm_adj.dot(d_mat_inv)

            print('generate laplacian-normalized adjacency matrix.')
            return norm_adj.tocoo()

        def band_cross_hop_laplacian(adj, low_pass=0.0025, high_stop=1):
            cross_adj = adj.dot(adj)
            # cross_adj.data = np.where(cross_adj.data>filter_numer, cross_adj.data, 0.)
            rowsum = np.array(cross_adj.sum(1))
            d_inv = np.power(rowsum, -1/2).flatten()
            d_inv[np.isinf(d_inv)] = 0.
            d_mat_inv = sp.diags(d_inv)
            row_norm_adj = d_mat_inv.dot(cross_adj)
            norm_adj = row_norm_adj.dot(d_mat_inv)
            norm_adj.data[np.isinf(norm_adj.data)] = 0.
            norm_adj.data = np.where(norm_adj.data>low_pass, norm_adj.data, 0.)
            norm_adj.data = np.where(norm_adj.data<high_stop, norm_adj.data, 0.)
            norm_adj.eliminate_zeros()
            print('generate filtered laplacian-normalized cross-hop adjacency matrix.')
            return norm_adj.tocoo()
        
        def check_adj_if_equal(adj):
            dense_A = np.array(adj.todense())
            degree = np.sum(dense_A, axis=1, keepdims=False)

            temp = np.dot(np.diag(np.power(degree, -1)), dense_A)
            print('check normalized adjacency matrix whether equal to this laplacian matrix.')
            return temp
        '''
        norm_adj_mat = normalized_adj_single(adj_mat + sp.eye(adj_mat.shape[0]))
        mean_adj_mat = normalized_adj_single(adj_mat)
        '''
        laplacian_adj_mat = normalized_adj_laplacian(adj_mat + sp.eye(adj_mat.shape[0]))
        laplacian_adj_mat_noeye = normalized_adj_laplacian(adj_mat)
        cross_adj_mat = band_cross_hop_laplacian(adj_mat, low_pass=low, high_stop=high)
        print('already normalize adjacency matrix', time.time() - t2)
        #return adj_mat.tocsr(), norm_adj_mat.tocsr(), mean_adj_mat.tocsr()
        return adj_mat.tocsr(), laplacian_adj_mat.tocsr(), laplacian_adj_mat_noeye.tocsr(), cross_adj_mat.tocsr()

コメントされた部分はLightGCNのコード一部であり、他は同じですが、この部分はデータ量が多い場合に非常に顕著な問題があります。詳細については私の問題を参照してください。もちろん、コードアドレスからもわかります。

BPR損失など、他の部分は実際には同じですが、この部分は同じです。

3-推論部分

モデルトレーニングの結果はまだユーザーとアイテムの埋め込みであり、これ取得した後、faissを直接使用して呼び出すことができます。その指標の評価については、私のブログ投稿、HRMAPMRRNDCGなどを参照してください

ちょっと待って、シャオミン兄弟。

 

悲しみがワインを待っています。川のボートが揺れ、二階のカーテンが動いた。

Qiuniang交差点とTainiang橋、風がはためく、雨がはためく。

 

[20201122-20:32補足]

私は言及されたDGCFを調べました-これは7月のSIGIRからのものであり、LightGCNと比較されていませんでしたが、私のブログ投稿は11月のものであり、LightGCNと比較されました。もちろん、こういうことで、あなたはDGCF、私もDGCF、シャオミン、シャオミンですが、フルネームは違います。

家に帰って寝なさい。

[20201123-18:42補足アップデート]

テイクを詳しく見てのDGCF教師彼のチームは(ある、月、私は上記の、および下記の読書推奨、タイトルが解きほぐさグラフ協調フィルタリングである)、この論文の効果は同等ですLightGCN、と大きな違いはありません。以下は、データ指標の比較です。そして、このブログ投稿の効果はLightGCNよりも優れており、最後の表を見ることができます。

この記事でのDGCFの効果は次のとおりです。

もちろん、効果が良ければ役に立たず、実際に適用することはできません。そのため、実際に適用できる論文は多く、実際にはほとんど適用できません。

バイバイ

おすすめ

転載: blog.csdn.net/SPESEG/article/details/109896156