nextrec 0.4.20__py3-none-any.whl → 0.4.21__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nextrec/__version__.py +1 -1
- nextrec/basic/activation.py +9 -4
- nextrec/basic/callback.py +39 -87
- nextrec/basic/features.py +149 -28
- nextrec/basic/heads.py +4 -1
- nextrec/basic/layers.py +375 -94
- nextrec/basic/loggers.py +236 -39
- nextrec/basic/model.py +209 -316
- nextrec/basic/session.py +2 -2
- nextrec/basic/summary.py +323 -0
- nextrec/cli.py +3 -3
- nextrec/data/data_processing.py +45 -1
- nextrec/data/dataloader.py +2 -2
- nextrec/data/preprocessor.py +2 -2
- nextrec/loss/loss_utils.py +5 -30
- nextrec/models/multi_task/esmm.py +4 -6
- nextrec/models/multi_task/mmoe.py +4 -6
- nextrec/models/multi_task/ple.py +6 -8
- nextrec/models/multi_task/poso.py +5 -7
- nextrec/models/multi_task/share_bottom.py +6 -8
- nextrec/models/ranking/afm.py +4 -6
- nextrec/models/ranking/autoint.py +4 -6
- nextrec/models/ranking/dcn.py +8 -7
- nextrec/models/ranking/dcn_v2.py +4 -6
- nextrec/models/ranking/deepfm.py +5 -7
- nextrec/models/ranking/dien.py +8 -7
- nextrec/models/ranking/din.py +8 -7
- nextrec/models/ranking/eulernet.py +5 -7
- nextrec/models/ranking/ffm.py +5 -7
- nextrec/models/ranking/fibinet.py +4 -6
- nextrec/models/ranking/fm.py +4 -6
- nextrec/models/ranking/lr.py +4 -6
- nextrec/models/ranking/masknet.py +8 -9
- nextrec/models/ranking/pnn.py +4 -6
- nextrec/models/ranking/widedeep.py +5 -7
- nextrec/models/ranking/xdeepfm.py +8 -7
- nextrec/models/retrieval/dssm.py +4 -10
- nextrec/models/retrieval/dssm_v2.py +0 -6
- nextrec/models/retrieval/mind.py +4 -10
- nextrec/models/retrieval/sdm.py +4 -10
- nextrec/models/retrieval/youtube_dnn.py +4 -10
- nextrec/models/sequential/hstu.py +1 -3
- nextrec/utils/__init__.py +12 -14
- nextrec/utils/config.py +15 -5
- nextrec/utils/console.py +2 -2
- nextrec/utils/feature.py +2 -2
- nextrec/utils/torch_utils.py +57 -112
- nextrec/utils/types.py +59 -0
- {nextrec-0.4.20.dist-info → nextrec-0.4.21.dist-info}/METADATA +7 -5
- nextrec-0.4.21.dist-info/RECORD +81 -0
- nextrec-0.4.20.dist-info/RECORD +0 -79
- {nextrec-0.4.20.dist-info → nextrec-0.4.21.dist-info}/WHEEL +0 -0
- {nextrec-0.4.20.dist-info → nextrec-0.4.21.dist-info}/entry_points.txt +0 -0
- {nextrec-0.4.20.dist-info → nextrec-0.4.21.dist-info}/licenses/LICENSE +0 -0
|
@@ -55,7 +55,7 @@ class ShareBottom(BaseModel):
|
|
|
55
55
|
|
|
56
56
|
@property
|
|
57
57
|
def default_task(self):
|
|
58
|
-
nums_task =
|
|
58
|
+
nums_task = self.nums_task if hasattr(self, "nums_task") else None
|
|
59
59
|
if nums_task is not None and nums_task > 0:
|
|
60
60
|
return ["binary"] * nums_task
|
|
61
61
|
return ["binary"]
|
|
@@ -73,11 +73,10 @@ class ShareBottom(BaseModel):
|
|
|
73
73
|
optimizer_params: dict | None = None,
|
|
74
74
|
loss: str | nn.Module | list[str | nn.Module] | None = "bce",
|
|
75
75
|
loss_params: dict | list[dict] | None = None,
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
dense_l2_reg=1e-4,
|
|
76
|
+
embedding_l1_reg=0.0,
|
|
77
|
+
dense_l1_reg=0.0,
|
|
78
|
+
embedding_l2_reg=0.0,
|
|
79
|
+
dense_l2_reg=0.0,
|
|
81
80
|
**kwargs,
|
|
82
81
|
):
|
|
83
82
|
|
|
@@ -103,7 +102,6 @@ class ShareBottom(BaseModel):
|
|
|
103
102
|
sequence_features=sequence_features,
|
|
104
103
|
target=target,
|
|
105
104
|
task=resolved_task,
|
|
106
|
-
device=device,
|
|
107
105
|
embedding_l1_reg=embedding_l1_reg,
|
|
108
106
|
dense_l1_reg=dense_l1_reg,
|
|
109
107
|
embedding_l2_reg=embedding_l2_reg,
|
|
@@ -125,7 +123,7 @@ class ShareBottom(BaseModel):
|
|
|
125
123
|
# Calculate input dimension
|
|
126
124
|
input_dim = self.embedding.input_dim
|
|
127
125
|
# emb_dim_total = sum([f.embedding_dim for f in self.all_features if not isinstance(f, DenseFeature)])
|
|
128
|
-
# dense_input_dim = sum([
|
|
126
|
+
# dense_input_dim = sum([(f.embedding_dim or 1) for f in dense_features])
|
|
129
127
|
# input_dim = emb_dim_total + dense_input_dim
|
|
130
128
|
|
|
131
129
|
# Shared bottom network
|
nextrec/models/ranking/afm.py
CHANGED
|
@@ -67,11 +67,10 @@ class AFM(BaseModel):
|
|
|
67
67
|
optimizer_params: dict | None = None,
|
|
68
68
|
loss: str | nn.Module | None = "bce",
|
|
69
69
|
loss_params: dict | list[dict] | None = None,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
dense_l2_reg=1e-4,
|
|
70
|
+
embedding_l1_reg=0.0,
|
|
71
|
+
dense_l1_reg=0.0,
|
|
72
|
+
embedding_l2_reg=0.0,
|
|
73
|
+
dense_l2_reg=0.0,
|
|
75
74
|
**kwargs,
|
|
76
75
|
):
|
|
77
76
|
|
|
@@ -88,7 +87,6 @@ class AFM(BaseModel):
|
|
|
88
87
|
sequence_features=sequence_features,
|
|
89
88
|
target=target,
|
|
90
89
|
task=task or self.default_task,
|
|
91
|
-
device=device,
|
|
92
90
|
embedding_l1_reg=embedding_l1_reg,
|
|
93
91
|
dense_l1_reg=dense_l1_reg,
|
|
94
92
|
embedding_l2_reg=embedding_l2_reg,
|
|
@@ -88,11 +88,10 @@ class AutoInt(BaseModel):
|
|
|
88
88
|
optimizer_params: dict | None = None,
|
|
89
89
|
loss: str | nn.Module | None = "bce",
|
|
90
90
|
loss_params: dict | list[dict] | None = None,
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
dense_l2_reg=1e-4,
|
|
91
|
+
embedding_l1_reg=0.0,
|
|
92
|
+
dense_l1_reg=0.0,
|
|
93
|
+
embedding_l2_reg=0.0,
|
|
94
|
+
dense_l2_reg=0.0,
|
|
96
95
|
**kwargs,
|
|
97
96
|
):
|
|
98
97
|
|
|
@@ -102,7 +101,6 @@ class AutoInt(BaseModel):
|
|
|
102
101
|
sequence_features=sequence_features,
|
|
103
102
|
target=target,
|
|
104
103
|
task=task or self.default_task,
|
|
105
|
-
device=device,
|
|
106
104
|
embedding_l1_reg=embedding_l1_reg,
|
|
107
105
|
dense_l1_reg=dense_l1_reg,
|
|
108
106
|
embedding_l2_reg=embedding_l2_reg,
|
nextrec/models/ranking/dcn.py
CHANGED
|
@@ -102,11 +102,10 @@ class DCN(BaseModel):
|
|
|
102
102
|
optimizer_params: dict | None = None,
|
|
103
103
|
loss: str | nn.Module | None = "bce",
|
|
104
104
|
loss_params: dict | list[dict] | None = None,
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
dense_l2_reg=1e-4,
|
|
105
|
+
embedding_l1_reg=0.0,
|
|
106
|
+
dense_l1_reg=0.0,
|
|
107
|
+
embedding_l2_reg=0.0,
|
|
108
|
+
dense_l2_reg=0.0,
|
|
110
109
|
**kwargs,
|
|
111
110
|
):
|
|
112
111
|
|
|
@@ -123,7 +122,6 @@ class DCN(BaseModel):
|
|
|
123
122
|
sequence_features=sequence_features,
|
|
124
123
|
target=target,
|
|
125
124
|
task=task or self.default_task,
|
|
126
|
-
device=device,
|
|
127
125
|
embedding_l1_reg=embedding_l1_reg,
|
|
128
126
|
dense_l1_reg=dense_l1_reg,
|
|
129
127
|
embedding_l2_reg=embedding_l2_reg,
|
|
@@ -143,7 +141,10 @@ class DCN(BaseModel):
|
|
|
143
141
|
]
|
|
144
142
|
)
|
|
145
143
|
dense_input_dim = sum(
|
|
146
|
-
[
|
|
144
|
+
[
|
|
145
|
+
(f.embedding_dim if f.embedding_dim is not None else 1) or 1
|
|
146
|
+
for f in dense_features
|
|
147
|
+
]
|
|
147
148
|
)
|
|
148
149
|
input_dim = emb_dim_total + dense_input_dim
|
|
149
150
|
|
nextrec/models/ranking/dcn_v2.py
CHANGED
|
@@ -204,11 +204,10 @@ class DCNv2(BaseModel):
|
|
|
204
204
|
optimizer_params: dict | None = None,
|
|
205
205
|
loss: str | nn.Module | None = "bce",
|
|
206
206
|
loss_params: dict | list[dict] | None = None,
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
dense_l2_reg=1e-4,
|
|
207
|
+
embedding_l1_reg=0.0,
|
|
208
|
+
dense_l1_reg=0.0,
|
|
209
|
+
embedding_l2_reg=0.0,
|
|
210
|
+
dense_l2_reg=0.0,
|
|
212
211
|
**kwargs,
|
|
213
212
|
):
|
|
214
213
|
dense_features = dense_features or []
|
|
@@ -224,7 +223,6 @@ class DCNv2(BaseModel):
|
|
|
224
223
|
sequence_features=sequence_features,
|
|
225
224
|
target=target,
|
|
226
225
|
task=task or self.default_task,
|
|
227
|
-
device=device,
|
|
228
226
|
embedding_l1_reg=embedding_l1_reg,
|
|
229
227
|
dense_l1_reg=dense_l1_reg,
|
|
230
228
|
embedding_l2_reg=embedding_l2_reg,
|
nextrec/models/ranking/deepfm.py
CHANGED
|
@@ -71,11 +71,10 @@ class DeepFM(BaseModel):
|
|
|
71
71
|
optimizer_params: dict | None = None,
|
|
72
72
|
loss: str | nn.Module | None = "bce",
|
|
73
73
|
loss_params: dict | list[dict] | None = None,
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
dense_l2_reg=1e-4,
|
|
74
|
+
embedding_l1_reg=0.0,
|
|
75
|
+
dense_l1_reg=0.0,
|
|
76
|
+
embedding_l2_reg=0.0,
|
|
77
|
+
dense_l2_reg=0.0,
|
|
79
78
|
**kwargs,
|
|
80
79
|
):
|
|
81
80
|
|
|
@@ -93,7 +92,6 @@ class DeepFM(BaseModel):
|
|
|
93
92
|
sequence_features=sequence_features,
|
|
94
93
|
target=target,
|
|
95
94
|
task=task or self.default_task,
|
|
96
|
-
device=device,
|
|
97
95
|
embedding_l1_reg=embedding_l1_reg,
|
|
98
96
|
dense_l1_reg=dense_l1_reg,
|
|
99
97
|
embedding_l2_reg=embedding_l2_reg,
|
|
@@ -107,7 +105,7 @@ class DeepFM(BaseModel):
|
|
|
107
105
|
self.embedding = EmbeddingLayer(features=self.deep_features)
|
|
108
106
|
fm_emb_dim_total = sum([f.embedding_dim for f in self.fm_features])
|
|
109
107
|
# deep_emb_dim_total = sum([f.embedding_dim for f in self.deep_features if not isinstance(f, DenseFeature)])
|
|
110
|
-
# dense_input_dim = sum([
|
|
108
|
+
# dense_input_dim = sum([(f.embedding_dim or 1) for f in dense_features])
|
|
111
109
|
mlp_input_dim = self.embedding.input_dim
|
|
112
110
|
self.linear = LR(fm_emb_dim_total)
|
|
113
111
|
self.fm = FM(reduce_sum=True)
|
nextrec/models/ranking/dien.py
CHANGED
|
@@ -220,11 +220,10 @@ class DIEN(BaseModel):
|
|
|
220
220
|
optimizer_params: dict | None = None,
|
|
221
221
|
loss: str | nn.Module | None = "bce",
|
|
222
222
|
loss_params: dict | list[dict] | None = None,
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
dense_l2_reg=1e-4,
|
|
223
|
+
embedding_l1_reg=0.0,
|
|
224
|
+
dense_l1_reg=0.0,
|
|
225
|
+
embedding_l2_reg=0.0,
|
|
226
|
+
dense_l2_reg=0.0,
|
|
228
227
|
**kwargs,
|
|
229
228
|
):
|
|
230
229
|
|
|
@@ -243,7 +242,6 @@ class DIEN(BaseModel):
|
|
|
243
242
|
sequence_features=sequence_features,
|
|
244
243
|
target=target,
|
|
245
244
|
task=task or self.default_task,
|
|
246
|
-
device=device,
|
|
247
245
|
embedding_l1_reg=embedding_l1_reg,
|
|
248
246
|
dense_l1_reg=dense_l1_reg,
|
|
249
247
|
embedding_l2_reg=embedding_l2_reg,
|
|
@@ -342,7 +340,10 @@ class DIEN(BaseModel):
|
|
|
342
340
|
mlp_input_dim += gru_hidden_size # final interest state
|
|
343
341
|
mlp_input_dim += sum([f.embedding_dim for f in self.other_sparse_features])
|
|
344
342
|
mlp_input_dim += sum(
|
|
345
|
-
[
|
|
343
|
+
[
|
|
344
|
+
(f.embedding_dim if f.embedding_dim is not None else 1) or 1
|
|
345
|
+
for f in dense_features
|
|
346
|
+
]
|
|
346
347
|
)
|
|
347
348
|
|
|
348
349
|
self.mlp = MLP(input_dim=mlp_input_dim, **mlp_params)
|
nextrec/models/ranking/din.py
CHANGED
|
@@ -86,11 +86,10 @@ class DIN(BaseModel):
|
|
|
86
86
|
optimizer_params: dict | None = None,
|
|
87
87
|
loss: str | nn.Module | None = "bce",
|
|
88
88
|
loss_params: dict | list[dict] | None = None,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
dense_l2_reg=1e-4,
|
|
89
|
+
embedding_l1_reg=0.0,
|
|
90
|
+
dense_l1_reg=0.0,
|
|
91
|
+
embedding_l2_reg=0.0,
|
|
92
|
+
dense_l2_reg=0.0,
|
|
94
93
|
**kwargs,
|
|
95
94
|
):
|
|
96
95
|
|
|
@@ -109,7 +108,6 @@ class DIN(BaseModel):
|
|
|
109
108
|
sequence_features=sequence_features,
|
|
110
109
|
target=target,
|
|
111
110
|
task=task or self.default_task,
|
|
112
|
-
device=device,
|
|
113
111
|
embedding_l1_reg=embedding_l1_reg,
|
|
114
112
|
dense_l1_reg=dense_l1_reg,
|
|
115
113
|
embedding_l2_reg=embedding_l2_reg,
|
|
@@ -168,7 +166,10 @@ class DIN(BaseModel):
|
|
|
168
166
|
mlp_input_dim += behavior_emb_dim # attention pooled
|
|
169
167
|
mlp_input_dim += sum([f.embedding_dim for f in self.other_sparse_features])
|
|
170
168
|
mlp_input_dim += sum(
|
|
171
|
-
[
|
|
169
|
+
[
|
|
170
|
+
(f.embedding_dim if f.embedding_dim is not None else 1) or 1
|
|
171
|
+
for f in dense_features
|
|
172
|
+
]
|
|
172
173
|
)
|
|
173
174
|
|
|
174
175
|
# MLP for final prediction
|
|
@@ -211,11 +211,10 @@ class EulerNet(BaseModel):
|
|
|
211
211
|
optimizer_params: dict | None = None,
|
|
212
212
|
loss: str | nn.Module | None = "bce",
|
|
213
213
|
loss_params: dict | list[dict] | None = None,
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
dense_l2_reg=1e-4,
|
|
214
|
+
embedding_l1_reg=0.0,
|
|
215
|
+
dense_l1_reg=0.0,
|
|
216
|
+
embedding_l2_reg=0.0,
|
|
217
|
+
dense_l2_reg=0.0,
|
|
219
218
|
**kwargs,
|
|
220
219
|
):
|
|
221
220
|
|
|
@@ -232,7 +231,6 @@ class EulerNet(BaseModel):
|
|
|
232
231
|
sequence_features=sequence_features,
|
|
233
232
|
target=target,
|
|
234
233
|
task=task or self.default_task,
|
|
235
|
-
device=device,
|
|
236
234
|
embedding_l1_reg=embedding_l1_reg,
|
|
237
235
|
dense_l1_reg=dense_l1_reg,
|
|
238
236
|
embedding_l2_reg=embedding_l2_reg,
|
|
@@ -245,7 +243,7 @@ class EulerNet(BaseModel):
|
|
|
245
243
|
|
|
246
244
|
self.linear_features = dense_features + sparse_features + sequence_features
|
|
247
245
|
self.interaction_features = (
|
|
248
|
-
[f for f in dense_features if
|
|
246
|
+
[f for f in dense_features if f.use_projection]
|
|
249
247
|
+ sparse_features
|
|
250
248
|
+ sequence_features
|
|
251
249
|
)
|
nextrec/models/ranking/ffm.py
CHANGED
|
@@ -69,11 +69,10 @@ class FFM(BaseModel):
|
|
|
69
69
|
optimizer_params: dict | None = None,
|
|
70
70
|
loss: str | nn.Module | None = "bce",
|
|
71
71
|
loss_params: dict | list[dict] | None = None,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
dense_l2_reg=1e-4,
|
|
72
|
+
embedding_l1_reg=0.0,
|
|
73
|
+
dense_l1_reg=0.0,
|
|
74
|
+
embedding_l2_reg=0.0,
|
|
75
|
+
dense_l2_reg=0.0,
|
|
77
76
|
**kwargs,
|
|
78
77
|
):
|
|
79
78
|
dense_features = dense_features or []
|
|
@@ -89,7 +88,6 @@ class FFM(BaseModel):
|
|
|
89
88
|
sequence_features=sequence_features,
|
|
90
89
|
target=target,
|
|
91
90
|
task=task or self.default_task,
|
|
92
|
-
device=device,
|
|
93
91
|
embedding_l1_reg=embedding_l1_reg,
|
|
94
92
|
dense_l1_reg=dense_l1_reg,
|
|
95
93
|
embedding_l2_reg=embedding_l2_reg,
|
|
@@ -169,7 +167,7 @@ class FFM(BaseModel):
|
|
|
169
167
|
return f"{src_feature.embedding_name}__to__{target_field.name}"
|
|
170
168
|
|
|
171
169
|
def build_embedding(self, feature: SparseFeature | SequenceFeature) -> nn.Embedding:
|
|
172
|
-
if
|
|
170
|
+
if feature.pretrained_weight is not None:
|
|
173
171
|
weight = feature.pretrained_weight
|
|
174
172
|
if weight is None:
|
|
175
173
|
raise ValueError(
|
|
@@ -80,11 +80,10 @@ class FiBiNET(BaseModel):
|
|
|
80
80
|
optimizer_params: dict | None = None,
|
|
81
81
|
loss: str | nn.Module | None = "bce",
|
|
82
82
|
loss_params: dict | list[dict] | None = None,
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
dense_l2_reg=1e-4,
|
|
83
|
+
embedding_l1_reg=0.0,
|
|
84
|
+
dense_l1_reg=0.0,
|
|
85
|
+
embedding_l2_reg=0.0,
|
|
86
|
+
dense_l2_reg=0.0,
|
|
88
87
|
**kwargs,
|
|
89
88
|
):
|
|
90
89
|
|
|
@@ -102,7 +101,6 @@ class FiBiNET(BaseModel):
|
|
|
102
101
|
sequence_features=sequence_features,
|
|
103
102
|
target=target,
|
|
104
103
|
task=task or self.default_task,
|
|
105
|
-
device=device,
|
|
106
104
|
embedding_l1_reg=embedding_l1_reg,
|
|
107
105
|
dense_l1_reg=dense_l1_reg,
|
|
108
106
|
embedding_l2_reg=embedding_l2_reg,
|
nextrec/models/ranking/fm.py
CHANGED
|
@@ -67,11 +67,10 @@ class FM(BaseModel):
|
|
|
67
67
|
optimizer_params: dict | None = None,
|
|
68
68
|
loss: str | nn.Module | None = "bce",
|
|
69
69
|
loss_params: dict | list[dict] | None = None,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
dense_l2_reg=1e-4,
|
|
70
|
+
embedding_l1_reg=0.0,
|
|
71
|
+
dense_l1_reg=0.0,
|
|
72
|
+
embedding_l2_reg=0.0,
|
|
73
|
+
dense_l2_reg=0.0,
|
|
75
74
|
**kwargs,
|
|
76
75
|
):
|
|
77
76
|
|
|
@@ -85,7 +84,6 @@ class FM(BaseModel):
|
|
|
85
84
|
sequence_features=sequence_features,
|
|
86
85
|
target=target,
|
|
87
86
|
task=task or self.default_task,
|
|
88
|
-
device=device,
|
|
89
87
|
embedding_l1_reg=embedding_l1_reg,
|
|
90
88
|
dense_l1_reg=dense_l1_reg,
|
|
91
89
|
embedding_l2_reg=embedding_l2_reg,
|
nextrec/models/ranking/lr.py
CHANGED
|
@@ -66,11 +66,10 @@ class LR(BaseModel):
|
|
|
66
66
|
optimizer_params: dict | None = None,
|
|
67
67
|
loss: str | nn.Module | None = "bce",
|
|
68
68
|
loss_params: dict | list[dict] | None = None,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
dense_l2_reg=1e-4,
|
|
69
|
+
embedding_l1_reg=0.0,
|
|
70
|
+
dense_l1_reg=0.0,
|
|
71
|
+
embedding_l2_reg=0.0,
|
|
72
|
+
dense_l2_reg=0.0,
|
|
74
73
|
**kwargs,
|
|
75
74
|
):
|
|
76
75
|
|
|
@@ -87,7 +86,6 @@ class LR(BaseModel):
|
|
|
87
86
|
sequence_features=sequence_features,
|
|
88
87
|
target=target,
|
|
89
88
|
task=task or self.default_task,
|
|
90
|
-
device=device,
|
|
91
89
|
embedding_l1_reg=embedding_l1_reg,
|
|
92
90
|
dense_l1_reg=dense_l1_reg,
|
|
93
91
|
embedding_l2_reg=embedding_l2_reg,
|
|
@@ -179,11 +179,10 @@ class MaskNet(BaseModel):
|
|
|
179
179
|
optimizer_params: dict | None = None,
|
|
180
180
|
loss: str | nn.Module | None = "bce",
|
|
181
181
|
loss_params: dict | list[dict] | None = None,
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
dense_l2_reg: float = 1e-4,
|
|
182
|
+
embedding_l1_reg=0.0,
|
|
183
|
+
dense_l1_reg=0.0,
|
|
184
|
+
embedding_l2_reg=0.0,
|
|
185
|
+
dense_l2_reg=0.0,
|
|
187
186
|
**kwargs,
|
|
188
187
|
):
|
|
189
188
|
dense_features = dense_features or []
|
|
@@ -199,7 +198,6 @@ class MaskNet(BaseModel):
|
|
|
199
198
|
sequence_features=sequence_features,
|
|
200
199
|
target=target,
|
|
201
200
|
task=task or self.default_task,
|
|
202
|
-
device=device,
|
|
203
201
|
embedding_l1_reg=embedding_l1_reg,
|
|
204
202
|
dense_l1_reg=dense_l1_reg,
|
|
205
203
|
embedding_l2_reg=embedding_l2_reg,
|
|
@@ -220,16 +218,17 @@ class MaskNet(BaseModel):
|
|
|
220
218
|
), "MaskNet requires at least one feature for masking."
|
|
221
219
|
self.embedding = EmbeddingLayer(features=self.mask_features)
|
|
222
220
|
self.num_fields = len(self.mask_features)
|
|
223
|
-
self.embedding_dim =
|
|
221
|
+
self.embedding_dim = self.mask_features[0].embedding_dim
|
|
224
222
|
assert (
|
|
225
223
|
self.embedding_dim is not None
|
|
226
224
|
), "MaskNet requires mask_features to have 'embedding_dim' defined."
|
|
227
225
|
|
|
228
226
|
for f in self.mask_features:
|
|
229
|
-
edim =
|
|
227
|
+
edim = f.embedding_dim
|
|
230
228
|
if edim is None or edim != self.embedding_dim:
|
|
229
|
+
feat_name = f.name if hasattr(f, "name") else type(f)
|
|
231
230
|
raise ValueError(
|
|
232
|
-
f"MaskNet expects identical embedding_dim across all mask_features, but got {edim} for feature {
|
|
231
|
+
f"MaskNet expects identical embedding_dim across all mask_features, but got {edim} for feature {feat_name}."
|
|
233
232
|
)
|
|
234
233
|
|
|
235
234
|
self.v_emb_dim = self.num_fields * self.embedding_dim
|
nextrec/models/ranking/pnn.py
CHANGED
|
@@ -67,11 +67,10 @@ class PNN(BaseModel):
|
|
|
67
67
|
optimizer_params: dict | None = None,
|
|
68
68
|
loss: str | nn.Module | None = "bce",
|
|
69
69
|
loss_params: dict | list[dict] | None = None,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
dense_l2_reg=1e-4,
|
|
70
|
+
embedding_l1_reg=0.0,
|
|
71
|
+
dense_l1_reg=0.0,
|
|
72
|
+
embedding_l2_reg=0.0,
|
|
73
|
+
dense_l2_reg=0.0,
|
|
75
74
|
**kwargs,
|
|
76
75
|
):
|
|
77
76
|
|
|
@@ -91,7 +90,6 @@ class PNN(BaseModel):
|
|
|
91
90
|
sequence_features=sequence_features,
|
|
92
91
|
target=target,
|
|
93
92
|
task=task or self.default_task,
|
|
94
|
-
device=device,
|
|
95
93
|
embedding_l1_reg=embedding_l1_reg,
|
|
96
94
|
dense_l1_reg=dense_l1_reg,
|
|
97
95
|
embedding_l2_reg=embedding_l2_reg,
|
|
@@ -67,11 +67,10 @@ class WideDeep(BaseModel):
|
|
|
67
67
|
optimizer_params: dict | None = None,
|
|
68
68
|
loss: str | nn.Module | None = "bce",
|
|
69
69
|
loss_params: dict | list[dict] | None = None,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
dense_l2_reg=1e-4,
|
|
70
|
+
embedding_l1_reg=0.0,
|
|
71
|
+
dense_l1_reg=0.0,
|
|
72
|
+
embedding_l2_reg=0.0,
|
|
73
|
+
dense_l2_reg=0.0,
|
|
75
74
|
**kwargs,
|
|
76
75
|
):
|
|
77
76
|
|
|
@@ -87,7 +86,6 @@ class WideDeep(BaseModel):
|
|
|
87
86
|
sequence_features=sequence_features,
|
|
88
87
|
target=target,
|
|
89
88
|
task=task or self.default_task,
|
|
90
|
-
device=device,
|
|
91
89
|
embedding_l1_reg=embedding_l1_reg,
|
|
92
90
|
dense_l1_reg=dense_l1_reg,
|
|
93
91
|
embedding_l2_reg=embedding_l2_reg,
|
|
@@ -112,7 +110,7 @@ class WideDeep(BaseModel):
|
|
|
112
110
|
# Deep part: MLP
|
|
113
111
|
input_dim = self.embedding.input_dim
|
|
114
112
|
# deep_emb_dim_total = sum([f.embedding_dim for f in self.deep_features if not isinstance(f, DenseFeature)])
|
|
115
|
-
# dense_input_dim = sum([
|
|
113
|
+
# dense_input_dim = sum([(f.embedding_dim or 1) for f in dense_features])
|
|
116
114
|
self.mlp = MLP(input_dim=input_dim, **mlp_params)
|
|
117
115
|
self.prediction_layer = TaskHead(task_type=self.task)
|
|
118
116
|
# Register regularization weights
|
|
@@ -127,11 +127,10 @@ class xDeepFM(BaseModel):
|
|
|
127
127
|
optimizer_params: dict | None = None,
|
|
128
128
|
loss: str | nn.Module | None = "bce",
|
|
129
129
|
loss_params: dict | list[dict] | None = None,
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
dense_l2_reg=1e-4,
|
|
130
|
+
embedding_l1_reg=0.0,
|
|
131
|
+
dense_l1_reg=0.0,
|
|
132
|
+
embedding_l2_reg=0.0,
|
|
133
|
+
dense_l2_reg=0.0,
|
|
135
134
|
**kwargs,
|
|
136
135
|
):
|
|
137
136
|
|
|
@@ -148,7 +147,6 @@ class xDeepFM(BaseModel):
|
|
|
148
147
|
sequence_features=sequence_features,
|
|
149
148
|
target=target,
|
|
150
149
|
task=task or self.default_task,
|
|
151
|
-
device=device,
|
|
152
150
|
embedding_l1_reg=embedding_l1_reg,
|
|
153
151
|
dense_l1_reg=dense_l1_reg,
|
|
154
152
|
embedding_l2_reg=embedding_l2_reg,
|
|
@@ -184,7 +182,10 @@ class xDeepFM(BaseModel):
|
|
|
184
182
|
]
|
|
185
183
|
)
|
|
186
184
|
dense_input_dim = sum(
|
|
187
|
-
[
|
|
185
|
+
[
|
|
186
|
+
(f.embedding_dim if f.embedding_dim is not None else 1) or 1
|
|
187
|
+
for f in dense_features
|
|
188
|
+
]
|
|
188
189
|
)
|
|
189
190
|
self.mlp = MLP(input_dim=deep_emb_dim_total + dense_input_dim, **mlp_params)
|
|
190
191
|
self.prediction_layer = TaskHead(task_type=self.task)
|
nextrec/models/retrieval/dssm.py
CHANGED
|
@@ -50,12 +50,10 @@ class DSSM(BaseMatchModel):
|
|
|
50
50
|
num_negative_samples: int = 4,
|
|
51
51
|
temperature: float = 1.0,
|
|
52
52
|
similarity_metric: Literal["dot", "cosine", "euclidean"] = "cosine",
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
dense_l2_reg: float = 0.0,
|
|
58
|
-
early_stop_patience: int = 20,
|
|
53
|
+
embedding_l1_reg=0.0,
|
|
54
|
+
dense_l1_reg=0.0,
|
|
55
|
+
embedding_l2_reg=0.0,
|
|
56
|
+
dense_l2_reg=0.0,
|
|
59
57
|
optimizer: str | torch.optim.Optimizer = "adam",
|
|
60
58
|
optimizer_params: dict | None = None,
|
|
61
59
|
scheduler: (
|
|
@@ -81,12 +79,10 @@ class DSSM(BaseMatchModel):
|
|
|
81
79
|
num_negative_samples=num_negative_samples,
|
|
82
80
|
temperature=temperature,
|
|
83
81
|
similarity_metric=similarity_metric,
|
|
84
|
-
device=device,
|
|
85
82
|
embedding_l1_reg=embedding_l1_reg,
|
|
86
83
|
dense_l1_reg=dense_l1_reg,
|
|
87
84
|
embedding_l2_reg=embedding_l2_reg,
|
|
88
85
|
dense_l2_reg=dense_l2_reg,
|
|
89
|
-
early_stop_patience=early_stop_patience,
|
|
90
86
|
**kwargs,
|
|
91
87
|
)
|
|
92
88
|
|
|
@@ -175,8 +171,6 @@ class DSSM(BaseMatchModel):
|
|
|
175
171
|
loss_params=loss_params,
|
|
176
172
|
)
|
|
177
173
|
|
|
178
|
-
self.to(device)
|
|
179
|
-
|
|
180
174
|
def user_tower(self, user_input: dict) -> torch.Tensor:
|
|
181
175
|
"""
|
|
182
176
|
User tower encodes user features into embeddings.
|
|
@@ -46,12 +46,10 @@ class DSSM_v2(BaseMatchModel):
|
|
|
46
46
|
num_negative_samples: int = 4,
|
|
47
47
|
temperature: float = 1.0,
|
|
48
48
|
similarity_metric: Literal["dot", "cosine", "euclidean"] = "dot",
|
|
49
|
-
device: str = "cpu",
|
|
50
49
|
embedding_l1_reg: float = 0.0,
|
|
51
50
|
dense_l1_reg: float = 0.0,
|
|
52
51
|
embedding_l2_reg: float = 0.0,
|
|
53
52
|
dense_l2_reg: float = 0.0,
|
|
54
|
-
early_stop_patience: int = 20,
|
|
55
53
|
optimizer: str | torch.optim.Optimizer = "adam",
|
|
56
54
|
optimizer_params: dict | None = None,
|
|
57
55
|
scheduler: (
|
|
@@ -77,12 +75,10 @@ class DSSM_v2(BaseMatchModel):
|
|
|
77
75
|
num_negative_samples=num_negative_samples,
|
|
78
76
|
temperature=temperature,
|
|
79
77
|
similarity_metric=similarity_metric,
|
|
80
|
-
device=device,
|
|
81
78
|
embedding_l1_reg=embedding_l1_reg,
|
|
82
79
|
dense_l1_reg=dense_l1_reg,
|
|
83
80
|
embedding_l2_reg=embedding_l2_reg,
|
|
84
81
|
dense_l2_reg=dense_l2_reg,
|
|
85
|
-
early_stop_patience=early_stop_patience,
|
|
86
82
|
**kwargs,
|
|
87
83
|
)
|
|
88
84
|
|
|
@@ -167,8 +163,6 @@ class DSSM_v2(BaseMatchModel):
|
|
|
167
163
|
loss_params=loss_params,
|
|
168
164
|
)
|
|
169
165
|
|
|
170
|
-
self.to(device)
|
|
171
|
-
|
|
172
166
|
def user_tower(self, user_input: dict) -> torch.Tensor:
|
|
173
167
|
"""User tower"""
|
|
174
168
|
all_user_features = (
|
nextrec/models/retrieval/mind.py
CHANGED
|
@@ -202,12 +202,10 @@ class MIND(BaseMatchModel):
|
|
|
202
202
|
num_negative_samples: int = 100,
|
|
203
203
|
temperature: float = 1.0,
|
|
204
204
|
similarity_metric: Literal["dot", "cosine", "euclidean"] = "dot",
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
dense_l2_reg: float = 0.0,
|
|
210
|
-
early_stop_patience: int = 20,
|
|
205
|
+
embedding_l1_reg=0.0,
|
|
206
|
+
dense_l1_reg=0.0,
|
|
207
|
+
embedding_l2_reg=0.0,
|
|
208
|
+
dense_l2_reg=0.0,
|
|
211
209
|
optimizer: str | torch.optim.Optimizer = "adam",
|
|
212
210
|
optimizer_params: dict | None = None,
|
|
213
211
|
scheduler: (
|
|
@@ -233,12 +231,10 @@ class MIND(BaseMatchModel):
|
|
|
233
231
|
num_negative_samples=num_negative_samples,
|
|
234
232
|
temperature=temperature,
|
|
235
233
|
similarity_metric=similarity_metric,
|
|
236
|
-
device=device,
|
|
237
234
|
embedding_l1_reg=embedding_l1_reg,
|
|
238
235
|
dense_l1_reg=dense_l1_reg,
|
|
239
236
|
embedding_l2_reg=embedding_l2_reg,
|
|
240
237
|
dense_l2_reg=dense_l2_reg,
|
|
241
|
-
early_stop_patience=early_stop_patience,
|
|
242
238
|
**kwargs,
|
|
243
239
|
)
|
|
244
240
|
|
|
@@ -335,8 +331,6 @@ class MIND(BaseMatchModel):
|
|
|
335
331
|
loss_params=loss_params,
|
|
336
332
|
)
|
|
337
333
|
|
|
338
|
-
self.to(device)
|
|
339
|
-
|
|
340
334
|
def user_tower(self, user_input: dict) -> torch.Tensor:
|
|
341
335
|
"""
|
|
342
336
|
User tower with multi-interest extraction
|