import%20marimo%0A%0A__generated_with%20%3D%20%220.23.16%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20METADATA%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22id%22%3A%20%22mlp%22%2C%0A%20%20%20%20%20%20%20%20%22name%22%3A%20%22Multilayer%20Perceptron%22%2C%0A%20%20%20%20%20%20%20%20%22types%22%3A%20%5B%22architecture%22%5D%2C%0A%20%20%20%20%20%20%20%20%22families%22%3A%20%5B%22neural_networks%22%5D%2C%0A%20%20%20%20%20%20%20%20%22tasks%22%3A%20%5B%22classification%22%2C%20%22regression%22%2C%20%22representation%22%5D%2C%0A%20%20%20%20%20%20%20%20%22data%22%3A%20%5B%22tabular%22%5D%2C%0A%20%20%20%20%20%20%20%20%22learning%22%3A%20%5B%22supervised%22%5D%2C%0A%20%20%20%20%20%20%20%20%22capacity%22%3A%20%22parametric%22%2C%0A%20%20%20%20%20%20%20%20%22mechanisms%22%3A%20%5B%22dense_layers%22%2C%20%22backpropagation%22%2C%20%22nonlinear_activation%22%5D%2C%0A%20%20%20%20%20%20%20%20%22properties%22%3A%20%5B%22nonlinear%22%2C%20%22representation_learning%22%5D%2C%0A%20%20%20%20%20%20%20%20%22constraints%22%3A%20%5B%22requires_large_data%22%2C%20%22requires_scaling%22%2C%20%22sensitive_to_tuning%22%5D%2C%0A%20%20%20%20%20%20%20%20%22difficulty%22%3A%20%22intermediate%22%2C%0A%20%20%20%20%20%20%20%20%22status%22%3A%20%22complete%22%2C%0A%20%20%20%20%20%20%20%20%22explainability%22%3A%20%22low%22%2C%0A%20%20%20%20%20%20%20%20%22training_cost%22%3A%20%22medium%22%2C%0A%20%20%20%20%20%20%20%20%22inference_cost%22%3A%20%22low%22%2C%0A%20%20%20%20%20%20%20%20%22data_appetite%22%3A%20%22high%22%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20mo.md(f%22%23%20%7BMETADATA%5B'name'%5D%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20In%20one%20sentence%0A%0A%20%20%20%20An%20MLP%20stacks%20learned%20linear%20transformations%20and%20nonlinear%20activations%20to%20model%20complex%20feature%20interactions.%0A%0A%20%20%20%20%23%23%20Mental%20model%0A%0A%20%20%20%20Each%20layer%20creates%20a%20new%20set%20of%20features%20from%20the%20previous%20set.%20One%20hidden%20unit%20may%20respond%20to%20%22high%20usage%20and%20recent%20signup%2C%22%20while%20later%20units%20combine%20many%20such%20patterns%20into%20a%20prediction.%0A%0A%20%20%20%20Without%20nonlinear%20activations%2C%20stacking%20linear%20layers%20collapses%20into%20one%20linear%20transformation.%20The%20activation%20is%20what%20lets%20depth%20create%20genuinely%20new%20shapes.%0A%0A%20%20%20%20%23%23%20Input%20and%20output%0A%0A%20%20%20%20-%20**Input%3A**%20a%20fixed-size%20numerical%20vector%2C%20often%20normalized.%0A%20%20%20%20-%20**Output%3A**%20values%2C%20logits%2C%20probabilities%2C%20embeddings%2C%20or%20multiple%20targets.%0A%20%20%20%20-%20**Learns%3A**%20weights%20and%20biases%20across%20dense%20layers.%0A%0A%20%20%20%20%23%23%20How%20it%20works%0A%0A%20%20%20%20A%20layer%20computes%3A%0A%0A%20%20%20%20%24%24h%20%3D%20%5Cphi(Wx%2Bb)%24%24%0A%0A%20%20%20%20where%20%24%5Cphi%24%20is%20an%20activation%20such%20as%20ReLU%20or%20GELU.%20The%20final%20loss%20measures%20prediction%20error.%20Backpropagation%20applies%20the%20chain%20rule%20to%20calculate%20gradients%2C%20and%20an%20optimizer%20such%20as%20Adam%20or%20SGD%20updates%20the%20weights.%0A%0A%20%20%20%20Width%20controls%20how%20many%20patterns%20a%20layer%20can%20represent%3B%20depth%20controls%20how%20many%20transformations%20can%20be%20composed.%20More%20of%20either%20increases%20capacity%2C%20not%20guaranteed%20usefulness.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20A%20practical%20example%0A%0A%20%20%20%20An%20MLP%20can%20predict%20demand%20from%20normalized%20product%2C%20price%2C%20promotion%2C%20and%20calendar%20features.%20It%20may%20discover%20interactions%20without%20manual%20crosses.%20On%20modest%20tabular%20data%2C%20boosted%20trees%20may%20still%20win%20because%20their%20threshold%20bias%20is%20efficient%20and%20their%20training%20is%20less%20data-hungry.%0A%0A%20%20%20%20%23%23%20When%20to%20use%20it%0A%0A%20%20%20%20-%20Inputs%20already%20form%20meaningful%20dense%20vectors%20or%20embeddings.%0A%20%20%20%20-%20Smooth%20nonlinear%20interactions%20matter.%0A%20%20%20%20-%20Multiple%20outputs%20or%20differentiable%20components%20must%20be%20trained%20jointly.%0A%20%20%20%20-%20Enough%20representative%20data%20or%20transfer%20learning%20exists.%0A%20%20%20%20-%20The%20model%20will%20become%20part%20of%20a%20larger%20neural%20system.%0A%0A%20%20%20%20%23%23%20When%20to%20avoid%20it%0A%0A%20%20%20%20-%20A%20small%20tabular%20dataset%20is%20the%20entire%20problem.%0A%20%20%20%20-%20Missing%20values%20and%20categories%20need%20effortless%20native%20handling.%0A%20%20%20%20-%20Individual%20decisions%20require%20simple%20explanations.%0A%20%20%20%20-%20Compute%20or%20tuning%20time%20is%20very%20limited.%0A%20%20%20%20-%20The%20input%20has%20spatial%20or%20sequential%20structure%20better%20captured%20by%20another%20architecture.%0A%0A%20%20%20%20%23%23%20Data%20preparation%0A%0A%20%20%20%20Scale%20continuous%20features.%20Encode%20categorical%20features%20carefully%3B%20embeddings%20are%20useful%20for%20higher-cardinality%20categories.%20Split%20before%20fitting%20transforms.%20Monitor%20distribution%20shifts%20because%20neural%20predictions%20can%20become%20confidently%20unreliable%20away%20from%20training%20data.%0A%0A%20%20%20%20%23%23%20Important%20controls%0A%0A%20%20%20%20%7C%20Control%20%7C%20Role%20%7C%0A%20%20%20%20%7C---------%7C------%7C%0A%20%20%20%20%7C%20Depth%20and%20width%20%7C%20Capacity%20and%20cost%20%7C%0A%20%20%20%20%7C%20Activation%20%7C%20Gradient%20flow%20and%20representation%20behavior%20%7C%0A%20%20%20%20%7C%20Learning%20rate%20%7C%20Often%20the%20most%20sensitive%20optimization%20setting%20%7C%0A%20%20%20%20%7C%20Batch%20size%20%7C%20Noise%2C%20memory%2C%20and%20throughput%20%7C%0A%20%20%20%20%7C%20Weight%20decay%20%2F%20dropout%20%7C%20Regularization%20%7C%0A%20%20%20%20%7C%20Early%20stopping%20%7C%20Limits%20overfitting%20and%20wasted%20compute%20%7C%0A%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%20Notebook%20%E2%80%94%20learned%20nonlinear%20features%0A%0A%20%20%20%20**Question%3A**%20what%20does%20a%20hidden%20nonlinear%20layer%20buy%20us%20over%20a%20linear%20boundary%3F%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20from%20sklearn.datasets%20import%20make_moons%0A%20%20%20%20from%20sklearn.inspection%20import%20DecisionBoundaryDisplay%0A%20%20%20%20from%20sklearn.linear_model%20import%20LogisticRegression%0A%20%20%20%20from%20sklearn.neural_network%20import%20MLPClassifier%0A%20%20%20%20from%20sklearn.pipeline%20import%20make_pipeline%0A%20%20%20%20from%20sklearn.preprocessing%20import%20StandardScaler%0A%0A%20%20%20%20X%2C%20y%20%3D%20make_moons(n_samples%3D500%2C%20noise%3D0.22%2C%20random_state%3D10)%0A%20%20%20%20models%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22linear%20boundary%22%3A%20make_pipeline(StandardScaler()%2C%20LogisticRegression())%2C%0A%20%20%20%20%20%20%20%20%22MLP%20(16%2C%2016)%22%3A%20make_pipeline(%0A%20%20%20%20%20%20%20%20%20%20%20%20StandardScaler()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20MLPClassifier(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hidden_layer_sizes%3D(16%2C%2016)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20early_stopping%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_iter%3D2000%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20random_state%3D2%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%7D%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20DecisionBoundaryDisplay%2C%0A%20%20%20%20%20%20%20%20MLPClassifier%2C%0A%20%20%20%20%20%20%20%20StandardScaler%2C%0A%20%20%20%20%20%20%20%20X%2C%0A%20%20%20%20%20%20%20%20make_pipeline%2C%0A%20%20%20%20%20%20%20%20models%2C%0A%20%20%20%20%20%20%20%20plt%2C%0A%20%20%20%20%20%20%20%20y%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(DecisionBoundaryDisplay%2C%20X%2C%20models%2C%20plt%2C%20y)%3A%0A%20%20%20%20fig%2C%20axes%20%3D%20plt.subplots(1%2C%202%2C%20figsize%3D(10%2C%204))%0A%20%20%20%20for%20ax%2C%20(name%2C%20_model)%20in%20zip(axes%2C%20models.items())%3A%0A%20%20%20%20%20%20%20%20_model.fit(X%2C%20y)%0A%20%20%20%20%20%20%20%20DecisionBoundaryDisplay.from_estimator(_model%2C%20X%2C%20ax%3Dax%2C%20alpha%3D0.3)%0A%20%20%20%20%20%20%20%20ax.scatter(X%5B%3A%2C%200%5D%2C%20X%5B%3A%2C%201%5D%2C%20c%3Dy%2C%20s%3D12%2C%20edgecolor%3D%22k%22%2C%20linewidth%3D0.2)%0A%20%20%20%20%20%20%20%20ax.set_title(f%22%7Bname%7D%20%E2%80%94%20accuracy%20%7B_model.score(X%2C%20y)%3A.3f%7D%22)%0A%20%20%20%20plt.tight_layout()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(MLPClassifier%2C%20StandardScaler%2C%20X%2C%20make_pipeline%2C%20y)%3A%0A%20%20%20%20%23%20Check%20sensitivity%20to%20random%20initialization.%0A%20%20%20%20scores%20%3D%20%5B%5D%0A%20%20%20%20for%20seed%20in%20range(8)%3A%0A%20%20%20%20%20%20%20%20_model%20%3D%20make_pipeline(%0A%20%20%20%20%20%20%20%20%20%20%20%20StandardScaler()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20MLPClassifier(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hidden_layer_sizes%3D(8%2C)%2C%20early_stopping%3DTrue%2C%20max_iter%3D1200%2C%20random_state%3Dseed%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20).fit(X%2C%20y)%0A%20%20%20%20%20%20%20%20scores.append(_model.score(X%2C%20y))%0A%20%20%20%20print(%22scores%20across%20seeds%3A%22%2C%20%5Bround(score%2C%203)%20for%20score%20in%20scores%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%20Evaluation%20and%20diagnosis%0A%0A%20%20%20%20Track%20training%20and%20validation%20loss%20together.%20Use%20learning%20curves%2C%20multiple%20seeds%2C%20calibration%20checks%2C%20and%20slice%20evaluation.%20If%20training%20fails%2C%20inspect%20scaling%2C%20learning%20rate%2C%20initialization%2C%20gradient%20magnitude%2C%20and%20target%20encoding%20before%20redesigning%20the%20architecture.%0A%0A%20%20%20%20Compare%20against%20a%20linear%20model%20and%20a%20tree%20ensemble.%20A%20neural%20network%20should%20earn%20its%20additional%20complexity.%0A%0A%20%20%20%20%23%23%20Cost%20profile%0A%0A%20%20%20%20Inference%20is%20dense%20matrix%20multiplication%20and%20can%20be%20efficient%20on%20accelerators.%20Training%20cost%20grows%20with%20layers%2C%20width%2C%20examples%2C%20and%20optimization%20steps.%20Small%20MLPs%20can%20still%20run%20comfortably%20on%20CPUs.%0A%0A%20%20%20%20%23%23%20Related%20models%0A%0A%20%20%20%20-%20**Logistic%20Regression**%20is%20essentially%20an%20MLP%20without%20hidden%20nonlinear%20layers.%0A%20%20%20%20-%20**TCN**%20adds%20temporal%20convolution%20for%20ordered%20data.%0A%20%20%20%20-%20**Transformer**%20adds%20attention%20and%20position-aware%20sequence%20processing.%0A%20%20%20%20-%20**Gradient%20Boosting**%20is%20often%20a%20stronger%20tabular%20baseline.%0A%0A%20%20%20%20%23%23%20Practical%20takeaway%0A%0A%20%20%20%20An%20MLP%20is%20the%20basic%20neural%20workhorse.%20Use%20it%20when%20learned%20dense%20interactions%20are%20the%20right%20bias%2C%20not%20merely%20because%20%22deep%20learning%22%20sounds%20more%20advanced.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
c192346dfc8f61a46c4c0c57edf5324c