Cita:  quiero evitar eso debido a que son 2500 checkboxes.
    ¿De verdad son tantos o sólo estás exagerando? 
¿Quién en el mundo sería capaz de usar un formulario así?  
Pues veamos, tampoco es que tengas que verificar uno a uno, si usas un array todo será simple aún así tengas millones de registros. 
 
 
Una técnica para entender que valores han sido modificados es usar arrays:   
Código HTML:
Ver original- <input type="hidden" name="foo[bar]" value="original"> 
- <input type="checkbox" name="foo[bar]"> 
La clave está en el name, que debe ser idéntico para ambos casos, y no puedes usar "foo[]" sin índices pues no existiría relación entre ambos campos. 
Ahora, los checkboxes funcionan del siguiente modo: sólo si están marcados se envían, caso contrario se ignoran. 
Y todo los input sobreescriben a los input previos con el mismo name. 
Dado eso, entonces: 
- El campo hidden almacena el valor previo u original
- Si no se activa el checkbox entonces se envía dicho valor previo
- Si se activa el checkbox sobreescribe el campo y enviará el valor modificado (el previo se pierde)