Add exposure-only input ablation

This commit is contained in:
2026-07-12 16:00:34 +08:00
parent 0339f1a278
commit 14608ed04d
4 changed files with 48 additions and 2 deletions

View File

@@ -220,6 +220,15 @@ def parse_args() -> argparse.Namespace:
parser.add_argument("--n_head", type=int, default=10)
parser.add_argument("--n_hist_layer", type=int, default=12)
parser.add_argument("--dropout", type=float, default=0.0)
parser.add_argument(
"--input_ablation",
choices=["none", "exposure_only"],
default="none",
help=(
"Input ablation. 'exposure_only' removes disease-token embeddings "
"while retaining exposure, sex, and age embeddings."
),
)
parser.add_argument("--exposure_cache_dir", type=str, default=None)
parser.add_argument(
"--exposure_embeddings_file",
@@ -308,6 +317,10 @@ def parse_args() -> argparse.Namespace:
raise ValueError(
"--exposure_cache_dir is required with --exposure_embeddings_file"
)
if args.input_ablation == "exposure_only" and not args.exposure_cache_dir:
raise ValueError(
"--input_ablation exposure_only requires --exposure_cache_dir"
)
if args.target_mode == "uts":
args.readout_name = args.readout_name or "same_time_group_end"
args.include_no_event_in_uts_target = True
@@ -403,11 +416,16 @@ def distributed_run_dir(
) -> tuple[Path, str]:
payload: list[str | None] = [None, None]
if rank == 0:
input_label = (
args.input_ablation
if args.input_ablation != "none"
else ("exposure" if args.exposure_cache_dir else "noexposure")
)
run_dir, run_name = create_unique_run_dir(
lambda timestamp: (
f"absolute_exponential_next_token_{args.target_mode}_"
f"gap_{args.no_event_interval_years:g}y_"
f"{'exposure' if args.exposure_cache_dir else 'noexposure'}_"
f"{input_label}_"
f"{timestamp}"
)
)
@@ -436,6 +454,7 @@ def build_model(args: argparse.Namespace, dataset: HealthDataset) -> DeepHealth:
dist_mode="exponential",
dropout=args.dropout,
use_exposure_embeddings=args.exposure_embeddings_file is not None,
input_ablation=args.input_ablation,
)
@@ -619,6 +638,7 @@ def build_metadata(
"vocab_size": int(dataset.vocab_size),
},
"use_exposure_embeddings": args.exposure_embeddings_file is not None,
"input_ablation": args.input_ablation,
"exposure_cache_dir": args.exposure_cache_dir,
"exposure_embeddings_file": args.exposure_embeddings_file,
"num_workers": int(args.num_workers),
@@ -655,6 +675,7 @@ def main() -> None:
logger.info(f"readout={args.readout_name}, target_mode={args.target_mode}")
logger.info(f"exposure_cache_dir={args.exposure_cache_dir}")
logger.info(f"exposure_embeddings_file={args.exposure_embeddings_file}")
logger.info(f"input_ablation={args.input_ablation}")
logger.info(
"DataLoader IO: "
f"num_workers={args.num_workers}, "