MathML
All checks were successful
build_docker / essential (push) Successful in 0s
build_docker / build_paddle_ocr (push) Successful in 7m24s
build_docker / build_paddle_ocr_gpu (push) Successful in 27m31s
build_docker / build_easyocr (push) Successful in 23m46s
build_docker / build_easyocr_gpu (push) Successful in 26m37s
build_docker / build_doctr (push) Successful in 24m23s
build_docker / build_raytune (push) Successful in 5m46s
build_docker / build_doctr_gpu (push) Successful in 18m4s

This commit is contained in:
2026-02-04 21:14:45 +01:00
parent c796e4cc7f
commit 5ac0f486b8
2 changed files with 37 additions and 26 deletions

View File

@@ -92,22 +92,25 @@ def md_to_html_para(text):
def convert_latex_formulas(text):
"""Convert LaTeX formulas to styled text for easy copy-paste into Word equation editor.
Word's equation editor accepts LaTeX directly, so we preserve the LaTeX code
that users can copy and paste into Insert → Equation.
"""
# Block formulas $$...$$ - centered
"""Convert LaTeX formulas to MathML for Word compatibility."""
# Block formulas $$...$$
def convert_block(match):
latex = match.group(1).strip()
return f'<p class=MsoNormal style="text-align:center"><span lang=ES style="font-family:Cambria Math">{latex}</span></p>'
latex = match.group(1)
try:
mathml = latex_to_mathml(latex, display="block")
return f'<p class=MsoNormal style="text-align:center">{mathml}</p>'
except:
return match.group(0) # Keep original if conversion fails
text = re.sub(r'\$\$([^$]+)\$\$', convert_block, text)
# Inline formulas $...$ - inline with math font
# Inline formulas $...$
def convert_inline(match):
latex = match.group(1).strip()
return f'<span style="font-family:Cambria Math">{latex}</span>'
latex = match.group(1)
try:
return latex_to_mathml(latex, display="inline")
except:
return match.group(0)
text = re.sub(r'\$([^$]+)\$', convert_inline, text)
return text

View File

@@ -4673,11 +4673,11 @@ _Toc14106979"><span style="mso-bookmark:_Toc437515557"><span lang="ES" style="te
<p class="MsoNormal"><span lang="ES">La evaluación rigurosa de sistemas OCR requiere métricas estandarizadas que permitan comparaciones objetivas. Las métricas fundamentales se basan en la distancia de edición de Levenshtein.</span></p>
<h4 style="mso-list:none"><b><span lang="ES" style="text-transform:none">Distancia de Levenshtein</span></b></h4>
<p class="MsoNormal"><span lang="ES">La distancia de Levenshtein (Levenshtein, 1966) entre dos cadenas es el número mínimo de operaciones de edición (inserción, eliminación, sustitución) necesarias para transformar una cadena en otra. Formalmente, para dos cadenas <i>a</i> y <i>b</i>:</span></p>
<p class="MsoNormal"><span lang="ES"><p class="MsoNormal" style="text-align:center"><span lang="ES" style="font-family:Cambria Math">d(a,b) = \min(\text{inserciones} + \text{eliminaciones} + \text{sustituciones})</span></p></span></p>
<p class="MsoNormal" style="text-align:center"><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>d</mi><mo stretchy="false">(</mo><mi>a</mi><mo>,</mo><mi>b</mi><mo stretchy="false">)</mo><mo>=</mo><mo>min</mo><mo stretchy="false">(</mo><mtext>inserciones</mtext><mo>+</mo><mtext>eliminaciones</mtext><mo>+</mo><mtext>sustituciones</mtext><mo stretchy="false">)</mo></mrow></math></p>
<p class="MsoNormal"><span lang="ES">Esta métrica es fundamental para calcular tanto CER como WER.</span></p>
<h4 style="mso-list:none"><b><span lang="ES" style="text-transform:none">Character Error Rate (CER)</span></b></h4>
<p class="MsoNormal"><span lang="ES">El CER mide el error a nivel de carácter y se calcula como:</span></p>
<p class="MsoNormal"><span lang="ES"><p class="MsoNormal" style="text-align:center"><span lang="ES" style="font-family:Cambria Math">CER = \frac{S + D + I}{N}</span></p></span></p>
<p class="MsoNormal" style="text-align:center"><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>C</mi><mi>E</mi><mi>R</mi><mo>=</mo><mfrac><mrow><mi>S</mi><mo>+</mo><mi>D</mi><mo>+</mo><mi>I</mi></mrow><mrow><mi>N</mi></mrow></mfrac></mrow></math></p>
<p class="MsoNormal"><span lang="ES">Donde:</span></p>
<p class="MsoListParagraphCxSpFirst" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES">S = número de sustituciones de caracteres</span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES">D = número de eliminaciones de caracteres</span></p>
@@ -4686,7 +4686,7 @@ _Toc14106979"><span style="mso-bookmark:_Toc437515557"><span lang="ES" style="te
<p class="MsoNormal"><span lang="ES">Un CER bajo indica que el sistema comete pocos errores a nivel de carácter. Para aplicaciones críticas se requiere un nivel de error muy reducido, mientras que en tareas de búsqueda o archivo pueden aceptarse errores mayores.</span></p>
<h4 style="mso-list:none"><b><span lang="ES" style="text-transform:none">Word Error Rate (WER)</span></b></h4>
<p class="MsoNormal"><span lang="ES">El WER mide el error a nivel de palabra, utilizando la misma fórmula pero considerando palabras como unidades:</span></p>
<p class="MsoNormal"><span lang="ES"><p class="MsoNormal" style="text-align:center"><span lang="ES" style="font-family:Cambria Math">WER = \frac{S_w + D_w + I_w}{N_w}</span></p></span></p>
<p class="MsoNormal" style="text-align:center"><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>W</mi><mi>E</mi><mi>R</mi><mo>=</mo><mfrac><mrow><msub><mi>S</mi><mi>w</mi></msub><mo>+</mo><msub><mi>D</mi><mi>w</mi></msub><mo>+</mo><msub><mi>I</mi><mi>w</mi></msub></mrow><mrow><msub><mi>N</mi><mi>w</mi></msub></mrow></mfrac></mrow></math></p>
<p class="MsoNormal"><span lang="ES">El WER es generalmente mayor que el CER, ya que un solo error de carácter puede invalidar una palabra completa. Esta diferencia es relevante cuando se comparan sistemas que preservan caracteres pero pierden palabras completas.</span></p>
<h4 style="mso-list:none"><b><span lang="ES" style="text-transform:none">Otras Métricas Complementarias</span></b></h4>
<p class="MsoNormal"><span lang="ES"><b>Precisión y Recall a nivel de palabra</b>: Útiles cuando se evalúa la capacidad del sistema para detectar palabras específicas.</span></p>
@@ -4807,16 +4807,18 @@ _Toc14106979"><span style="mso-bookmark:_Toc437515557"><span lang="ES" style="te
<p class="MsoListParagraphCxSpMiddle" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES">Parámetros de regularización (dropout, weight decay)</span></p>
<p class="MsoListParagraphCxSpLast" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES"><b>Umbrales de decisión en tiempo de inferencia</b> (relevante para este trabajo)</span></p>
<p class="MsoNormal"><span lang="ES">El problema de HPO puede formalizarse como:</span></p>
<p class="MsoNormal"><span lang="ES"><p class="MsoNormal" style="text-align:center"><span lang="ES" style="font-family:Cambria Math">\lambda^* = \operatorname{argmin}_{\lambda \in \Lambda} \mathcal{L}(M_\lambda, D_{val})</span></p></span></p>
<p class="MsoNormal" style="text-align:center"><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><msup><mi>λ</mi><mo>*</mo></msup><mo>=</mo><msub><mo>argmin</mo><mrow><mi>λ</mi><mo></mo><mi>Λ</mi></mrow></msub><mi></mi><mo stretchy="false">(</mo><msub><mi>M</mi><mi>λ</mi></msub><mo>,</mo><msub><mi>D</mi><mrow><mi>v</mi><mi>a</mi><mi>l</mi></mrow></msub><mo stretchy="false">)</mo></mrow></math></p>
<p class="MsoNormal"><span lang="ES">Donde:</span></p>
<p class="MsoListParagraphCxSpFirst" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES"><span style="font-family:Cambria Math">\lambda</span> es un vector de hiperparámetros</span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES"><span style="font-family:Cambria Math">\Lambda</span> es el espacio de búsqueda</span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES"><span style="font-family:Cambria Math">M_\lambda</span> es el modelo configurado con <span style="font-family:Cambria Math">\lambda</span></span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES"><span style="font-family:Cambria Math">\mathcal{L}</span> es la función de pérdida</span></p>
<p class="MsoListParagraphCxSpLast" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES"><span style="font-family:Cambria Math">D_{val}</span> es el conjunto de validación</span></p>
<p class="MsoListParagraphCxSpFirst" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES"><math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>λ</mi></mrow></math> es un vector de hiperparámetros</span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES"><math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>Λ</mi></mrow></math> es el espacio de búsqueda</span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES"><math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><msub><mi>M</mi><mi>λ</mi></msub></mrow></math> es el modelo configurado con <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>λ</mi></mrow></math></span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES"><math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi></mi></mrow></math> es la función de pérdida</span></p>
<p class="MsoListParagraphCxSpLast" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES"><math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><msub><mi>D</mi><mrow><mi>v</mi><mi>a</mi><mi>l</mi></mrow></msub></mrow></math> es el conjunto de validación</span></p>
<h4 style="mso-list:none"><b><span lang="ES" style="text-transform:none">Métodos de Optimización</span></b></h4>
<p class="MsoNormal"><span lang="ES"><b>Grid Search (Búsqueda en rejilla)</b>:</span></p>
<p class="MsoNormal"><span lang="ES">El método más simple consiste en evaluar todas las combinaciones posibles de valores discretizados de los hiperparámetros. Para <span style="font-family:Cambria Math">k</span> hiperparámetros con <span style="font-family:Cambria Math">n</span> valores cada uno, requiere <span style="font-family:Cambria Math">n^k</span> evaluaciones.</span></p>
El método más simple consiste en evaluar todas las combinaciones posibles de valores discretizados de los hiperparámetros. Para <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>k</mi></mrow></math> hiperparámetros con <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>n</mi></mrow></math> valores cada uno, requiere <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><msup><mi>n</mi><mi>k</mi></msup></mrow></math> evaluaciones.
<p class="MsoNormal"><span lang="ES">Ventajas:</span></p>
<p class="MsoListParagraphCxSpFirst" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES">Exhaustivo y reproducible</span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES">Fácil de paralelizar</span></p>
@@ -4840,12 +4842,18 @@ _Toc14106979"><span style="mso-bookmark:_Toc437515557"><span lang="ES" style="te
<p class="MsoListParagraphCxSpMiddle" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES"><b>Random Forests</b>: Manejan bien espacios de alta dimensión y variables categóricas</span></p>
<p class="MsoListParagraphCxSpLast" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES"><b>Tree-structured Parzen Estimator (TPE)</b>: Modela densidades en lugar de la función objetivo</span></p>
<h4 style="mso-list:none"><b><span lang="ES" style="text-transform:none">Tree-structured Parzen Estimator (TPE)</span></b></h4>
<p class="MsoNormal"><span lang="ES">TPE, propuesto por Bergstra et al. (2011) e implementado en Optuna, es particularmente efectivo para HPO. En lugar de modelar <span style="font-family:Cambria Math">p(y|\lambda)</span> directamente, TPE modela:</span></p>
<p class="MsoNormal"><span lang="ES"><p class="MsoNormal" style="text-align:center"><span lang="ES" style="font-family:Cambria Math">p(\lambda|y) = \begin{cases} l(\lambda) &amp; \text{si } y &lt; y^<i> \\ g(\lambda) &amp; \text{si } y \geq y^</i> \end{cases}</span></p></span></p>
<p class="MsoNormal"><span lang="ES">Donde <span style="font-family:Cambria Math">y^*</span> es un umbral (típicamente el percentil 15-25 de las observaciones), <span style="font-family:Cambria Math">l(\lambda)</span> es la densidad de hiperparámetros con buen rendimiento, y <span style="font-family:Cambria Math">g(\lambda)</span> es la densidad de hiperparámetros con mal rendimiento.</span></p>
TPE, propuesto por Bergstra et al. (2011) e implementado en Optuna, es particularmente efectivo para HPO. En lugar de modelar <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>p</mi><mo stretchy="false">(</mo><mi>y</mi><mo stretchy="false">|</mo><mi>λ</mi><mo stretchy="false">)</mo></mrow></math> directamente, TPE modela:
<p class="MsoNormal" style="text-align:center"><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>p</mi><mo stretchy="false">(</mo><mi>λ</mi><mo stretchy="false">|</mo><mi>y</mi><mo stretchy="false">)</mo><mo>=</mo><mrow><mo fence="true" form="prefix" stretchy="true">{</mo><mtable><mtr><mtd columnalign="left"><mi>l</mi><mo stretchy="false">(</mo><mi>λ</mi><mo stretchy="false">)</mo></mtd><mtd columnalign="left"><mtext>si </mtext><mi>y</mi><mo>&lt;</mo><msup><mi>y</mi><mo>*</mo></msup></mtd></mtr><mtr><mtd columnalign="left"><mi>g</mi><mo stretchy="false">(</mo><mi>λ</mi><mo stretchy="false">)</mo></mtd><mtd columnalign="left"><mtext>si </mtext><mi>y</mi><mo></mo><msup><mi>y</mi><mo>*</mo></msup></mtd></mtr></mtable></mrow></mrow></math></p>
Donde <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><msup><mi>y</mi><mo>*</mo></msup></mrow></math> es un umbral (típicamente el percentil 15-25 de las observaciones), <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>l</mi><mo stretchy="false">(</mo><mi>λ</mi><mo stretchy="false">)</mo></mrow></math> es la densidad de hiperparámetros con buen rendimiento, y <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>λ</mi><mo stretchy="false">)</mo></mrow></math> es la densidad de hiperparámetros con mal rendimiento.
<p class="MsoNormal"><span lang="ES">La función de adquisición Expected Improvement se aproxima como:</span></p>
<p class="MsoNormal"><span lang="ES"><p class="MsoNormal" style="text-align:center"><span lang="ES" style="font-family:Cambria Math">EI(\lambda) \propto \frac{l(\lambda)}{g(\lambda)}</span></p></span></p>
<p class="MsoNormal"><span lang="ES">Configuraciones con alta probabilidad bajo <span style="font-family:Cambria Math">l</span> y baja probabilidad bajo <span style="font-family:Cambria Math">g</span> tienen mayor Expected Improvement.</span></p>
<p class="MsoNormal" style="text-align:center"><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>E</mi><mi>I</mi><mo stretchy="false">(</mo><mi>λ</mi><mo stretchy="false">)</mo><mo></mo><mfrac><mrow><mi>l</mi><mo stretchy="false">(</mo><mi>λ</mi><mo stretchy="false">)</mo></mrow><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>λ</mi><mo stretchy="false">)</mo></mrow></mfrac></mrow></math></p>
Configuraciones con alta probabilidad bajo <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>l</mi></mrow></math> y baja probabilidad bajo <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>g</mi></mrow></math> tienen mayor Expected Improvement.
<p class="MsoNormal"><span lang="ES"><b>Ventajas de TPE</b>:</span></p>
<p class="MsoListParagraphCxSpFirst" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES">Maneja naturalmente espacios condicionales (hiperparámetros que dependen de otros)</span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:36pt;text-indent:-18pt"><span lang="ES" style="font-family:Symbol">·</span><span lang="ES" style="font-size:7pt">     </span><span lang="ES">Eficiente para espacios de alta dimensión</span></p>