Skip to content

Commit 6585da2

Browse files
authored
Merge pull request RasaHQ#5212 from RasaHQ/tf2-response
add DIET2DIET to response selector
2 parents 24a8242 + d2dee3d commit 6585da2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+882
-671
lines changed

rasa/core/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,5 @@
5757
UTTER_PREFIX = "utter_"
5858
RESPOND_PREFIX = "respond_"
5959

60+
DIALOGUE = "dialogue"
6061
DEFAULT_CATEGORICAL_SLOT_VALUE = "__other__"

rasa/core/policies/embedding_policy.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import logging
22
from typing import Any, Dict, Optional, Text
33

4-
from rasa.core.constants import DEFAULT_POLICY_PRIORITY
4+
from rasa.core.constants import DEFAULT_POLICY_PRIORITY, DIALOGUE
55
from rasa.core.featurizers import TrackerFeaturizer
66
from rasa.core.policies.ted_policy import TEDPolicy
77
from rasa.constants import DOCS_BASE_URL
88
from rasa.utils.tensorflow.constants import (
9-
HIDDEN_LAYERS_SIZES_LABEL,
9+
LABEL,
10+
HIDDEN_LAYERS_SIZES,
1011
TRANSFORMER_SIZE,
1112
NUM_TRANSFORMER_LAYERS,
1213
NUM_HEADS,
@@ -28,7 +29,6 @@
2829
MU_NEG,
2930
MU_POS,
3031
EMBED_DIM,
31-
HIDDEN_LAYERS_SIZES_DIALOGUE,
3232
DROPRATE_DIALOGUE,
3333
DROPRATE_LABEL,
3434
DROPRATE_ATTENTION,
@@ -51,12 +51,9 @@ class EmbeddingPolicy(TEDPolicy):
5151
# default properties (DOC MARKER - don't remove)
5252
defaults = {
5353
# nn architecture
54-
# a list of hidden layers sizes before user embed layer
54+
# a list of hidden layers sizes before dialogue and action embed layers
5555
# number of hidden layers is equal to the length of this list
56-
HIDDEN_LAYERS_SIZES_DIALOGUE: [],
57-
# a list of hidden layers sizes before bot embed layer
58-
# number of hidden layers is equal to the length of this list
59-
HIDDEN_LAYERS_SIZES_LABEL: [],
56+
HIDDEN_LAYERS_SIZES: {DIALOGUE: [], LABEL: []},
6057
# number of units in transformer
6158
TRANSFORMER_SIZE: 128,
6259
# number of transformer layers

rasa/core/policies/registry.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
# noinspection PyUnresolvedReferences
55
from rasa.core.policies.ted_policy import TEDPolicy
66

7+
# noinspection PyUnresolvedReferences
8+
from rasa.core.policies.embedding_policy import EmbeddingPolicy
9+
710
# noinspection PyUnresolvedReferences
811
from rasa.core.policies.fallback import FallbackPolicy
912

rasa/core/policies/ted_policy.py

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,16 @@
1818
MaxHistoryTrackerFeaturizer,
1919
)
2020
from rasa.core.policies.policy import Policy
21-
from rasa.core.constants import DEFAULT_POLICY_PRIORITY
21+
from rasa.core.constants import DEFAULT_POLICY_PRIORITY, DIALOGUE
2222
from rasa.core.trackers import DialogueStateTracker
2323
from rasa.utils import train_utils
2424
from rasa.utils.tensorflow import layers
2525
from rasa.utils.tensorflow.transformer import TransformerEncoder
2626
from rasa.utils.tensorflow.models import RasaModel
2727
from rasa.utils.tensorflow.model_data import RasaModelData, FeatureSignature
2828
from rasa.utils.tensorflow.constants import (
29-
HIDDEN_LAYERS_SIZES_LABEL,
29+
LABEL,
30+
HIDDEN_LAYERS_SIZES,
3031
TRANSFORMER_SIZE,
3132
NUM_TRANSFORMER_LAYERS,
3233
NUM_HEADS,
@@ -48,7 +49,6 @@
4849
MU_NEG,
4950
MU_POS,
5051
EMBED_DIM,
51-
HIDDEN_LAYERS_SIZES_DIALOGUE,
5252
DROPRATE_DIALOGUE,
5353
DROPRATE_LABEL,
5454
DROPRATE_ATTENTION,
@@ -72,12 +72,9 @@ class TEDPolicy(Policy):
7272
# default properties (DOC MARKER - don't remove)
7373
defaults = {
7474
# nn architecture
75-
# a list of hidden layers sizes before user embed layer
75+
# a list of hidden layers sizes before dialogue and action embed layers
7676
# number of hidden layers is equal to the length of this list
77-
HIDDEN_LAYERS_SIZES_DIALOGUE: [],
78-
# a list of hidden layers sizes before bot embed layer
79-
# number of hidden layers is equal to the length of this list
80-
HIDDEN_LAYERS_SIZES_LABEL: [],
77+
HIDDEN_LAYERS_SIZES: {DIALOGUE: [], LABEL: []},
8178
# number of units in transformer
8279
TRANSFORMER_SIZE: 128,
8380
# number of transformer layers
@@ -262,8 +259,6 @@ def train(
262259
) -> None:
263260
"""Train the policy on given training trackers."""
264261

265-
logger.debug("Started training embedding policy.")
266-
267262
# set numpy random seed
268263
np.random.seed(self.config[RANDOM_SEED])
269264

@@ -282,6 +277,12 @@ def train(
282277

283278
# extract actual training data to feed to model
284279
model_data = self._create_model_data(training_data.X, training_data.y)
280+
if model_data.is_empty():
281+
logger.error(
282+
f"Can not train '{self.__class__.__name__}'. No data was provided. "
283+
f"Skipping training of the policy."
284+
)
285+
return
285286

286287
# keep one example for persisting and loading
287288
self.data_example = {k: [v[:1] for v in vs] for k, vs in model_data.items()}
@@ -452,14 +453,16 @@ def __init__(
452453
config: Dict[Text, Any],
453454
max_history_tracker_featurizer_used: bool,
454455
label_data: RasaModelData,
455-
):
456+
) -> None:
456457
super().__init__(name="TED", random_seed=config[RANDOM_SEED])
457458

458459
self.config = config
459460
self.max_history_tracker_featurizer_used = max_history_tracker_featurizer_used
460461

461462
# data
462463
self.data_signature = data_signature
464+
self._check_data()
465+
463466
self.predict_data_signature = {
464467
k: vs for k, vs in data_signature.items() if "dialogue" in k
465468
}
@@ -475,14 +478,26 @@ def __init__(
475478
)
476479

477480
# metrics
478-
self.metric_loss = tf.keras.metrics.Mean(name="loss")
479-
self.metric_acc = tf.keras.metrics.Mean(name="acc")
481+
self.action_loss = tf.keras.metrics.Mean(name="loss")
482+
self.action_acc = tf.keras.metrics.Mean(name="acc")
480483
self.metrics_to_log += ["loss", "acc"]
481484

482485
# set up tf layers
483486
self._tf_layers = {}
484487
self._prepare_layers()
485488

489+
def _check_data(self) -> None:
490+
if "dialogue_features" not in self.data_signature:
491+
raise ValueError(
492+
f"No text features specified. "
493+
f"Cannot train '{self.__class__.__name__}' model."
494+
)
495+
if "label_features" not in self.data_signature:
496+
raise ValueError(
497+
f"No label features specified. "
498+
f"Cannot train '{self.__class__.__name__}' model."
499+
)
500+
486501
def _prepare_layers(self) -> None:
487502
self._tf_layers["loss.label"] = layers.DotProductLoss(
488503
self.config[NUM_NEG],
@@ -496,16 +511,16 @@ def _prepare_layers(self) -> None:
496511
parallel_iterations=1 if self.random_seed is not None else 1000,
497512
)
498513
self._tf_layers["ffnn.dialogue"] = layers.Ffnn(
499-
self.config[HIDDEN_LAYERS_SIZES_DIALOGUE],
514+
self.config[HIDDEN_LAYERS_SIZES][DIALOGUE],
500515
self.config[DROPRATE_DIALOGUE],
501516
self.config[REGULARIZATION_CONSTANT],
502-
layer_name_suffix="dialogue",
517+
layer_name_suffix=DIALOGUE,
503518
)
504519
self._tf_layers["ffnn.label"] = layers.Ffnn(
505-
self.config[HIDDEN_LAYERS_SIZES_LABEL],
520+
self.config[HIDDEN_LAYERS_SIZES][LABEL],
506521
self.config[DROPRATE_LABEL],
507522
self.config[REGULARIZATION_CONSTANT],
508-
layer_name_suffix="label",
523+
layer_name_suffix=LABEL,
509524
)
510525
self._tf_layers["transformer"] = TransformerEncoder(
511526
self.config[NUM_TRANSFORMER_LAYERS],
@@ -520,18 +535,18 @@ def _prepare_layers(self) -> None:
520535
use_key_relative_position=self.config[KEY_RELATIVE_ATTENTION],
521536
use_value_relative_position=self.config[VALUE_RELATIVE_ATTENTION],
522537
max_relative_position=self.config[MAX_RELATIVE_POSITION],
523-
name="dialogue_encoder",
538+
name=DIALOGUE + "_encoder",
524539
)
525540
self._tf_layers["embed.dialogue"] = layers.Embed(
526541
self.config[EMBED_DIM],
527542
self.config[REGULARIZATION_CONSTANT],
528-
"dialogue",
543+
DIALOGUE,
529544
self.config[SIMILARITY_TYPE],
530545
)
531546
self._tf_layers["embed.label"] = layers.Embed(
532547
self.config[EMBED_DIM],
533548
self.config[REGULARIZATION_CONSTANT],
534-
"label",
549+
LABEL,
535550
self.config[SIMILARITY_TYPE],
536551
)
537552

@@ -588,8 +603,8 @@ def batch_loss(
588603
dialogue_embed, label_embed, label_in, all_labels_embed, all_labels, mask
589604
)
590605

591-
self.metric_loss.update_state(loss)
592-
self.metric_acc.update_state(acc)
606+
self.action_loss.update_state(loss)
607+
self.action_acc.update_state(acc)
593608

594609
return loss
595610

0 commit comments

Comments
 (0)