import%20marimo%0A%0A__generated_with%20%3D%20%220.25.0%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%20The%20network%20idea%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%20Build%20and%20combine%20learned%20features%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%20Step%20by%20step%3A%20one%20forward%20pass%0A%0A%20%20%20%20Consider%20an%20MLP%20with%20one%20hidden%20layer%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cmathbf%20z%5E%7B(1)%7D%3DW%5E%7B(1)%7D%5Cmathbf%20x%2B%5Cmathbf%20b%5E%7B(1)%7D%2C%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cmathbf%20h%3D%5Coperatorname%7BReLU%7D(%5Cmathbf%20z%5E%7B(1)%7D)%2C%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cmathbf%20z%5E%7B(2)%7D%3DW%5E%7B(2)%7D%5Cmathbf%20h%2B%5Cmathbf%20b%5E%7B(2)%7D.%0A%20%20%20%20%24%24%0A%0A%20%20%20%20Let%20the%20input%20be%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cmathbf%20x%3D%5Cbegin%7Bpmatrix%7D2%5C%5C-1%5Cend%7Bpmatrix%7D%2C%0A%20%20%20%20%24%24%0A%0A%20%20%20%20and%20use%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20W%5E%7B(1)%7D%3D%0A%20%20%20%20%5Cbegin%7Bpmatrix%7D%0A%20%20%20%200.5%261.0%5C%5C%0A%20%20%20%20-1.0%260.5%0A%20%20%20%20%5Cend%7Bpmatrix%7D%2C%0A%20%20%20%20%5Cqquad%0A%20%20%20%20%5Cmathbf%20b%5E%7B(1)%7D%3D%0A%20%20%20%20%5Cbegin%7Bpmatrix%7D0%5C%5C0.5%5Cend%7Bpmatrix%7D.%0A%20%20%20%20%24%24%0A%0A%20%20%20%20The%20hidden%20pre-activation%20is%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cmathbf%20z%5E%7B(1)%7D%0A%20%20%20%20%3D%5Cbegin%7Bpmatrix%7D%0A%20%20%20%20(0.5)(2)%2B(1)(-1)%5C%5C%0A%20%20%20%20(-1)(2)%2B(0.5)(-1)%2B0.5%0A%20%20%20%20%5Cend%7Bpmatrix%7D%0A%20%20%20%20%3D%5Cbegin%7Bpmatrix%7D0%5C%5C-2%5Cend%7Bpmatrix%7D.%0A%20%20%20%20%24%24%0A%0A%20%20%20%20Apply%20ReLU%20element%20by%20element%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cmathbf%20h%3D%5Cmax(0%2C%5Cmathbf%20z%5E%7B(1)%7D)%0A%20%20%20%20%3D%5Cbegin%7Bpmatrix%7D0%5C%5C0%5Cend%7Bpmatrix%7D.%0A%20%20%20%20%24%24%0A%0A%20%20%20%20This%20hidden%20vector%20becomes%20the%20input%20to%20the%20next%20layer.%20Every%20later%20layer%20repeats%20the%20same%20two%20operations%3A%20affine%20transformation%2C%20then%20activation.%0A%0A%20%20%20%20%23%23%20Why%20the%20activation%20matters%0A%0A%20%20%20%20Without%20activations%2C%20two%20layers%20collapse%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20W%5E%7B(2)%7D(W%5E%7B(1)%7D%5Cmathbf%20x%2B%5Cmathbf%20b%5E%7B(1)%7D)%2B%5Cmathbf%20b%5E%7B(2)%7D%0A%20%20%20%20%3DW'%5Cmathbf%20x%2B%5Cmathbf%20b'.%0A%20%20%20%20%24%24%0A%0A%20%20%20%20This%20is%20still%20one%20linear%20transformation.%20A%20nonlinear%20activation%20prevents%20that%20collapse%20and%20allows%20different%20regions%20of%20the%20input%20space%20to%20follow%20different%20linear%20rules.%0A%0A%20%20%20%20%23%23%20How%20learning%20happens%0A%0A%20%20%20%201.%20The%20forward%20pass%20computes%20intermediate%20values%20and%20a%20final%20output.%0A%20%20%20%202.%20A%20task-specific%20loss%20scores%20the%20output.%0A%20%20%20%203.%20%5BBackpropagation%5D(%2Fconcepts%2Fbackpropagation)%20computes%20one%20gradient%20for%20every%20parameter.%0A%20%20%20%204.%20%5BLoss%20and%20Optimization%5D(%2Fconcepts%2Floss_optimization)%20explains%20how%20an%20optimizer%20applies%20those%20gradients.%0A%0A%20%20%20%20The%20model%20notebook%20owns%20the%20architecture%3B%20the%20linked%20concept%20notebooks%20own%20the%20gradient%20derivations.%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(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20The%20setup%20fits%20a%20linear%20reference%20and%20two%20networks%20on%20the%20same%20curved%20data.%20The%20next%0A%20%20%20%20cell%20plots%20their%20decision%20regions%2C%20making%20the%20role%20of%20hidden%20nonlinear%20features%0A%20%20%20%20visible%20instead%20of%20judging%20the%20architectures%20from%20accuracy%20alone.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%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(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20The%20boundaries%20show%20what%20added%20hidden%20capacity%20can%20represent.%20Capacity%20also%20changes%0A%20%20%20%20the%20number%20of%20learned%20values%2C%20so%20the%20next%20calculation%20counts%20parameters%20for%20one%0A%20%20%20%20network%20and%20connects%20architecture%20size%20to%20data%20needs%20and%20regularization.%0A%20%20%20%20%22%22%22)%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%20What%20depth%20changes%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%0A%20%20%20%20%23%23%20Concept%20references%0A%0A%20%20%20%20-%20%5BThe%20Perceptron%5D(%2Fconcepts%2Fperceptron)%20%E2%80%94%20the%20weighted-sum%20unit.%0A%20%20%20%20-%20%5BBackpropagation%5D(%2Fconcepts%2Fbackpropagation)%20%E2%80%94%20the%20gradient%20calculation%20through%20layers.%0A%20%20%20%20-%20%5BRegularization%5D(%2Fconcepts%2Fregularization)%20%E2%80%94%20controlling%20unstable%20capacity.%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
1ebd328a83c9810b361a9aa79e1a072d